spark任务生成和提交流程详解

首先将代码打包上传到集群

更多大数据、spark、Hadoop等学习资料可以加我微信获取“mipi946”

1、Driver端会调用SparkSubmit类(内部执行submit->doRunMain->通过反射

获取应用程序的主类对象->执行主类的main方法)

2、构建sparkConf和sparkContext对象,在sparkContext入口做了三件事,创建

了sparkEnv对象(创建了ActorSystem对象)TaskScheduler(用来生成并发送

task给Executor)DAGScheduler(用来划分Stage)

3、clientActor将任务封装到ApplicationDescription对象并且提交给Master

4、Master收到任务信息后,将任务信息存到内存中,同时放到队列中(waitingApp)

5、任务信息开始执行后,调用schedule方法,进行资源的调度。

6、将调度好的资源封装到LaunchExecutor并发送给对应的worker。

7、worker接收到master发送来的任务调度信息(LaunchExecutor),将信息封装

成一个ExecutorRunner对象。

8、封装成ExecutorRunner后,调用ExecutorRunner的·start方法,开始启动GoarseGrainedExecutorBackend对象

9、Executor启动后DriverActor进行反向注册。

10、与DriverActor注册成功后,创建一个线程池(TreadPool)用来执行任务

11、当所有的Executor注册完成后,意味着作业环境准备好了,Driver端会结束与

sparkContext对象的初始化。

12、当Driver初始化完成后(创建一个sc实例)会继续执行我们自己提交的App

代码,当触发了action算子时就会触发一个job,这时就会调用DAGScheduler对象

进行Stage划分。

13、DagScheduler开始进行stage划分。

14、将划分好的stage按照分区生成一个一个的task,并且封装到TaskSet对象中

然后TaskSet提交到TaskScheduler

15、TaskScheduler按照提交过来的TaskSet,拿到一个序列化器,将TaskSet序列化

,将序列化好的Task封装到LaunchExecutor并且提交到DriverActor。

16、DriverActor把LauchExcutor发送到Excutro上。

17、Executor接收到DriverActor发送过来的任务(LaunchExecutro),会将其封装成为

TaskRunner,然后从线程池中获取线程来执行TaskRunner。

18、TaskRunner拿到反序列化器,反序列Taskset,然后执行App代码,也就是对

RDD分区上执行的算子和自定义函数。

ClientActor:负责和Master通信,向Master注册任务信息

DriverActor:负责和Executor进行通信,接收到 Executor反向注册和把任务发送到Executer。

你可能感兴趣的:(spark任务生成和提交流程详解)