Spark提交流程
转载:https://www.cnblogs.com/frankdeng/p/9301485.html
转载:http://www.imooc.com/article/253664
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。