####蔚蓝天空####
当我们编写好自己的应用application后,打JAR包,放入一个spark集群节点上执行:spark-submit…等角本来执行application时,(其实我们之前的提交模式叫Standalone),其实会通过反射创建一个DriverActor进程出来。
一:执行我们的application,也就是我们写的程代码,我们回想一下,之前我们写的spark应用的第一行是不是先构造一个sparkConf,接着通过sparkConfs构造一个非常重要的对象:SparkContext
例:val conf = new SparkConf()
val sc = new SparkContext(conf)
通过源码我们可以得到,在初使化上面SparkContext后,做的最重要的两件事:
1:构造出DAGScheduler
2:构造出TaskScheduler
二:通过上面构造出的TaskScheduler(它有自己的后台进程),负责去连接Master,向Master注册我们写的Application
三:在Spark集群中,Master节点接收到上面Application的注册请求后,会使用自己的资源调度算法,在spark的worker集群上,为Application启动多个Executor(Master通知Worker,为Application启动executor)
四:在Worker内部,接收到Master发来的通知后,为Application启动多个executor(在Executor内部有个线程池),这个时间Executor启动后会反向注册到TaskScheduler,让TaskScheduler知道有哪些executor在执行这个application
五:上面的二,三,四步就在完成了初使化SparkContext的功能,接着继续执行我们写的应用代码(算子操作),在进行算子操作时遇到action算子,就会创建一个JOB,JOB同进就会被提交到上面在第一步时创建的DAGScheduler里,DAGScheduler会把JOB划分为多个stag,然后每个stag创建一个taskSet(里面是每个task),会把taskSet提交给TaskScheduler里,TaskScheduler会把taskSet里的每个taskr提交到executor上执行(task分配算法)
上面提到的taskSet里的task分两种:ShuffleMapTask与ResultTask,只有最后一个stag里的tas才是ResultTask外,其它的都是ShuffleMapTask
所以,最后整个spark应用程序的执行,是stag分批次作为taskSet提交到executor执行,每个task针对RDD的一个partition,执行我们定义的算法与函数,以此类推,直到我们所有操作完成.