1(图中流程标号):当我们在strandalone模式下提交我们的spark应用时,会创建和构造一个DriverActor进程出来,这个进程会执行我们的Application应用程序。。。 2:写过spark应用程序的都知道,第一步需要构造SparkConf然后创建一个SC(SparkContext),重点来了,SparkContext在初始化的时候最重要的是干两件事:就是构造DAGScheduler和TaskScheDuler。 3:然后,TaskScheduler会负责,通过他的一个后台进程,去连接Master,向Master注册Application. 4:Master接收到TaskScheduler的注册请求后,会使用自己的资源调度算法,在Spark集群的Worker上为Application申请多个Executor,并且通知Worker启动相应的Executor。(实际中有许多的Worker和Executor,这里只用一个来画图展示) 5:Worker会为Application启动相应的Executor。 6:Executor启动后会把自己反向注册到Taskscheduler上面去,至此SparkContext的初始化结束,Driver继续执行我们的程序。 7:每当执行到一个action操作(例如:foreach...)的时候,就会创建一个job,并将job提交给DAGSheduler,DAGScheduler会将job划分为多个stage(按照宽依赖进行划分),然后每个stage创建一个TaskSet,并将TaskSet交给TaskSheduler。 8:TaskSheduler会将每一个TaskSet中的每一个task提交到executor上执行(task分配算法)。 9:Executor每接收到一个task,就会用TaskRunner来封装task,然后丢入线程池进行执行。 总结:spark应用程序的执行,就是stage分批次的作为task提交到executor执行,每一个task针对RDD的partition,执行我们的算子和函数,以此类推,直到所有的操作执行完为止。