Spark源码解读--任务生成和提交过程

Application
把APP打包上传到集群:
$SPARK_HOME/spark-submit \
–class com.sparktest \
–master spark://minimaster:7077 \
/home/wc.jar

Driver端:
1.调用SparkSubmit类,内部执行submit → doRunMain → 通过反射获取应用程序的主类对象 → 执行主类的main方法

SparkContext
2.构建SparkConf和SparkContext对象,在SparkContext入口类做了三件事,创建了SparkEnv对象(创建了SparkEnv对象[创建了ActorSystem对象]TaskScheduler[用来生成并发送task给Executor],DAGScheduler[用来划分Stage])

3.ClientActor将任务信息封装到ApplicationDescription对象里并且提交给Master

Master端:
4.Master收到ClientActor提交的任务信息后,把任务信息存到内存中,然后又将任务信息放到队列中(waitingApps)
5.当开始执行这个任务信息时,调用scheduler方法,进行资源调度
6.将调度好的资源封装到LaunchExecutor并发送给对应的Worker

Worker端:
7.Worker接收到Master发送过来的调度信息(LaunchExecutor)后,将信息封装成一个ExecutorRunner对象
8.封装成ExecutorRunner后,调用ExecutorRunner的start方法,开始启动CoarseGrainedExecutorBackend对象

TaskScheduler
ClientActor:负责和Master通信,向Master注册任务信息
DriverActor:负责和Executor通信,接收Executor反向注册和把任务发送到Executor

9.Executor启动后向DriverActor进行反向注册
Executor:
10.与DriverActor注册成功后,创建一个线程池(ThreadPool),用来执行任务

17.Executor接收到DriverActor发送过来的任务(LaunchExecutor),会将其封装成TaskRunner,然后从线程池中获取线程来执行TaskRunner
18.TaskRunner拿到反序列化TaskSet.然后执行APP代码,也就是对RDD分区上执行的算子和自定义函数

11.当所有的Executor注册完成后,意味着作业环境准备好了,Driver端会结束语SparkContext对象的初始化

DAGScheduler
12.当Driver初始化完成后(创建一个sc实例),会继续执行我们自己提交的APP的代码,当触发了Action的RDD算子时,就触发了一个job,这时就会调用DAGScheduler对象进行stage划分
13.DAGScheduler开始进行Stage划分

14.将划分好的Stage按照分区生成一个一个的task,并且封装到TaskSet对象,然后TaskSet提交到TaskScheduler
15.TaskScheduler接收到提交过来的Taskset,拿到一个序列化器,对TaskSet序列化,将序列化好的TaskSet封装到LaunchExecutor并提交到DriverActor

16.把LaunchExecutor发送到Executor上

Spark源码解读--任务生成和提交过程_第1张图片

你可能感兴趣的:(Spark)