JobPlus知识库 IT 大数据 文章
Spark任务调度原理解析

1.调用SparkSubmit类 执行submit方法 -->doRunmain--> RunMain-->通过反射机制创建我们的主类对象--》再拿到主类的main方法--》执行主类的main方法

2.开始构造sparkConf对象和sparkContext对象 作为提交任务的入口类,在sparkContext入口类里会做三件事,

创建了SparkEnv对象(创建了ActorSystem对象),

创建了DAGSchedular(进行Stage划分)

以及taskSchedular(用来生成和发送task的),

TaskSchedular 有两个Actor

ClientActor 负责和Master通信 作用向Master注册应用

DriverActor 负责和Executor通信 作用用来接收executor反向注册和把任务提交到executor

3、ClientActor将我们提交任务的参数封装到ApplicationDescription 对象里提交到Master上、

4、Master 接收到ClientActor提交的任务信息先存放到内存中,然后放到任务队列中(waitingApps变量)

5、当开始执行这个任务信息时,调用Scheduler方法进行资源的调度(资源改变的时候都调度)

6、将调度好的资源分装成LaunchExecutor 并且发送给对应的Worker

7、worker接收到Master发送的调度信息 LaunchExecutor,会将信息封装成ExecutorRunner

8、封装成ExecutorRunner后,调用ExecutorRunner.start()方法启动 CoraseGraindExecutorBankend对象 他就是Executor

作用:执行DriverActor发送过来的任务

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

10、注册完成后创建一个线程池(ThreadPool)

11、当所有的Executor注册完成后 意味着运行我们作业的环境 已经准备好了,Driver会结束SparkContext对象的初始化

任务调度:


12、当Driver初始化完成后(创建了一个SC实例),会继续执行我们编写的代码,当触发了Action的RDD算子时,就意味着出拉分了一个job,此事就会调用一个DAGScheduler进行Stage的划分

13、DAGScheduler开始进行Stage划分

14、将划分好的Stage按照分区数生成一个一个的task封装到taskSet对象,然后TaskSet提交该TaskScheduler

15、TaskScheduler接收到提交过来的TaskSet时,会拿到一个序列化器,对TaskSet进行序列化,

之后将序列化好的TaskSet封装成LaunchExecutor

16、发送LanchExecutor到Executor上执行任务

17、Executor接收到DriverActor发送过来的LaunchExecutor时,会将其封装成TaskRunner,然后从线程池中获取线程并执行TaskRunner

TaskRunner

18、TaskRunner拿到反序列化器,反序列化TaskSet,然后执行我们编写的代码,也就是对RDD分区上的数据进行 map filter sortBy


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
72人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序