Spark任务运行过程解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qichangjian/article/details/88034705

spark-submit->SparkSubmit->main->submit->doRunMain->RunMain->通过反射,创建我们编写的主类的实例对象,调用main方法->开始执行我们的代码->初始化sparkContext对象->创建初始rdd->出发action算子->提交job->worker执行任务->任务结束

spark任务的本质:将rdd以来关系切分成一个个stage,然后将stage作为taskSet分批次的发送到executor上执行。
在这里插入图片描述
过程总结:
1.将我们编写的程序打包jar

2.提交spark-submit脚本到集群上运行

3.运行sparkSubmit的main方法,在这个方法中通过反射的方式创建我们编写的主类的实例对象,然后调用mian方法,开始执行我们的代码(注意:我们的spark程序driver就运行在sparkSubmit进程中)

4.当代码运行到创建SparkContext对象时,就开始初始化SparkContext对象。

5.在初始化SparkContext对象的时候,会创建两个特别重要的对象分别是:DAGScheduler和TaskScheduler.

DAGScheduler:作用:将rdd的以来关系切分成一个一个的stage,然后将stage作为taskSet提交到TaskScheduler中的DriverActor

6.在构建TaskScheduler的同时,会创建两个特别重要的对象,分别是DriverActor和ClientActor.

ClientAcotr作用:向master注册用户提交的任务
DriverActor作用:接收executor的反向注册,将任务task提交给executor执行

7.当ClientActor启动后,会将永固提交的任务和相关参数封装在ApplicationDescription对象中,然后提交给Master进行任务的注册。

8.当master接受到ClientActor提交的任务请求时,会将请求参数进行解析并封装在application,然后将其持久化,然后将其加入到任务队列中。

任务队列默认是按照FIFO(先进先出)顺序执行。

9.当轮到我们提交的任务开始执行的时候,就开始调用schedule()方法进行任务资源的调度。

10,master将调度好的资源封装到 launchExecutor中发送给指定的Worker。

11.woker接受到Master发送过来的launchExecutor时,会将其压缩并封装到 ExecutorRunner中,然后调用这个对象的start方法启动execuotr(executor在worker中)

12.Executor启动后会向DriverActor进行反向注册

13.DriverActor会发送注册成功的消息给Executor.

14.Executor接受到DriverActor注册成功的消息后会创建一个线程池,用来执行DriverActor发送过来的task任务

15.当属于这个任务的所有executor启动并反向注册成功,意味着这个任务的环境已经准备好了。Driver会结束sparkContext对象的初始化。也就意味着new Context这句代码执行完成。

16.当初始化sparkContext成功后,driver端会继续运行我们编写的代码,然后开始创建初始的rdd,然后进行一系列的转换操作,当遇到一个action算子的时候,也就意味着出发了一个job.

17driver会将这个job提交给DAGScheduler

18.DAGScheduler将接受到的job,从最后一个算子开始向前推导,将DAG依据宽依赖划分为一个个stage,然后stage封装成taskset,并将taskSet中的task任务提交给DriverActor.

19.DriverActor接受到DAGSchduler发送过来的task,会拿到一个序列化器,对task进行序列化,然后将序列化好的task封装到launchTask中,然后将launchTask发送给指定的executor.

20.executor接收到driverActor发送过来的launchTask后,会拿到一个反序列化器,对launchTask进行反序列化,封装到TaskRunner中,然后从executor这个线程池中获取一个线程,将反序列化好的任务中的算子作用在rdd对应的分区上。

21.最终当所有的task任务完成之后,整个application执行完成,关闭sparkContext对象。

猜你喜欢

转载自blog.csdn.net/qichangjian/article/details/88034705