1、application(自己编写的应用程序),拷贝到用来提交spark应用的机器上,用spark-summit来提交这个application,在standalone模式下,会在本机客户端直接启动一个driver进程。
2、在driver里面首先干的第一件事就是构造sparkcontext,构造的时候会初始化DAGScheduler和TaskScheduler,构造完TaskScheduler后悔发送请求给Master去注册application,注册的时候Master会使用自己的资源调度算法在多个worker上给application启动多个Excutor,Excutor启动之后对TaskScheduler也就是我们的driver进行反向注册,注册完之后开始编写我们自己编写的代码,这个时候每次执行到一个action算子就会触发一个job,这个job就会给DAGScheduler,DAGScheduler会把它划分成多个stage,每一个stage创建一个TaskSet,TaskSet会提交给TaskScheduler,TaskScheduler再把这些task分解到之前反向注册过来的Excutor上去执行,Excutor接收到task会用TaskRunner来封装,然后会从自己的线程池里取出Excutor线程来执行,task在实际执行的时候会拷贝我们的代码,反序列化,然后去执行我们的task,task分两种,ShuffleMapTask和ResultTask两种,只有最后一个stage是ResultTask。每一个task是针对RDD的一个partition去并行的去执行的,这些task执行完了一批初始的RDD的算子和函数之后,会产生新的RDD,这批task只要在一个stage里面,会继续的去执行代码里面编写的第二个RDD的一些算子和函数,以此类推,这个stage执行完会进入下一个stage,所以stage和job执行完了我们恩spark程序就执行完了
Spark内核架构深度剖析.png
网友评论