1.架构
Spark内存架构,主要由以下组成:
- 1、Application
- 2、Spark-submit
- 3、Driver
- 4、SparkContext
- 5、Master
- 6、Worker
- 7、Executor
- 8、Job
- 9、DAGScheduler
- 10、TaskScheduler
- 11、ShuffleMapTask and ResultTask
2、Spark应用程序执行过程
- 1、通过spark-submit——shell 脚本提交Application(自己的Spark程序)——启动一个Driver进程;当然还有别的方式提交Application,后面会继续介绍
- 2、Driver执行Application应用程序,生成SparkContext(下面3—8步都是在进行SparkContext初始化)
- 3、SparkContext在初始化时,会构造DAGScheduler和TaskScheduler
- 4、TaskScheduler通过它对应的一个后台进程,去连接Master,向Master注册Application
- 5、Master接收到Application注册的请求之后,会使用自己的资源调度算法,通知Worker,为这个Application启动多个Executor
- 6、worker会为Application启动Executor
- 7、Executor启动之后会自己反向注册到TaskScheduler
- 8、所有Executor都反向注册到Driver上之后,Driver结束SparkContext初始化,会继续执行我们自己编写的代码
- 9、继续执行代码,每执行一个action,就会创建一个Job,Job 会提交给DAGScheduler
- 10、DAGScheduler会将job划分为多个stage,然后为每个stage创建一个TaskSet(stage划分算法)
- 11、DAGScheduler创建完成taskSet以后,TaskScheduler会把TaskSet里的每一个task提交到Executor执行(task分配算法)
- 12、Executor每接收到一个task,都会用TaskRunner来封装task,然后从线程池取出一个线程,执行这个task
- 13、所以,最后整个spark应用程序的执行,就是stage分批次作为taskSet提交到Executor执行,每个task针对RDD的一个partiton,执行我们定义的算子和函数,以此类推,直到所有的操作都执行为止
Task有两种,ShuffleMapTask和ResultTask,只有最后一个stage是ResultTask,之前的stage,都是ShuffleMapTask