Spark内核架构深度剖析
2018-05-29 本文已影响21人
SunnyMore
内核架构剖析.png
流程详解
- 使用
Standalone
提交模式,将我们编写好的Application
打成jar包上传到某Spark
节点上,通过spark-submit
提交Application
,该命令运行后在该节点会通过反射的方式,创建和构造一个DriverActor
进程,就是我们经常说的Driver
,该进程负责执行我们的Application
,也就是我们编写的代码。
- 使用
- 就像我们编写代码一样,
Driver
进程首先构造SparkConf
,接着创建SparkContext
对象,SparkContext
在初始化的时候,会构造DAGScheduler
和TaskScheduler
。
- 就像我们编写代码一样,
-
TaskScheduler
接着通过启动自己的后台进程,去连接Master
,向Master
注册Application
。
-
-
Master
收到Application
注册的请求后,会使用自己的资源调度算法,为该Application
分配运行资源,分配完成后就通知Spark
集群上相应的Worker
节点,为这个Application
启动分配一定数量的Executor
。
-
-
Executor
启动之后会自己反向注册到TaskScheduler
上去。
-
- 当所有
Executor
完成反向注册后,DriverActor
继续执行应用程序中的代码,每执行到一个action
操作,就会创建一个Job
,Driver
会将Job
提交给DAGScheduler
,DAGScheduler
会将Job
基于Stage
划分算法划分为多个Stage
,然后每个Stage
作为TaskSets
提交到TaskScheduler
,随后TaskScheduler
会将TaskSet
里每一个Task
(Task
分配算法)提交到Executor
上执行。
- 当所有
-
Executor
每接收到一个Task
,都会用TaskRunner
(将我们编写的代码,也就是要执行的算子以及函数,拷贝,反序列化,然后执行Task
)来封装Task
,然后从线程池(每一个Executor
都有一个线程池)里取出一个线程,执行这个Task
。
-
-
Task
有两种,ShuffleMapTask
和ResultTask
,每个Job
中只有最后一个Stage
是ResultTask
。
-
- 所以最后整个
Spark
应用程序的执行,就是Stage
分批次作为Taskset
提交到Executor
执行,每个Task
针对RDD
的一个Partition
,执行我们定义的算子和函数,以此类推,直到所有操作执行结束为止。
- 所以最后整个