您的位置:首页 > 其它

spark2.2 任务调度器TaskScheduler源码解析

2019-04-02 23:19 232 查看

1、TaskScheduler的作用

TaskScheduler是一个特质,目前只有一个TaskSchedulerImpl的实现类

TaskSchedulerImpl的功能包括:

1、接收DAGScheduler给每个Stage创建的Task集合

2、按照调度算法将资源分配给Task

3、将Task交给Spark集群不同节点上的Executor运行

4、在这些Task执行失败时进行重试,通过推断执行减轻落后的Task对整体作业进度的影响

2、TaskSchedulerImpl的初始化与启动

首先在SparkContext中的createTaskScheduler方法中,根据不同的部署模式,会创建相对应的TaskSchedulerImpl和SchedulerBackend。

无论以何种方式创建的TaskSchedulerImpl都系需要调用TaskSchedulerImpl的initialize方法对TaskSchedulerImpl进行初始化。

在初始化过程中:

1、TaskSchedulerImpl的backend属性

2、创建根调度池,根据对应的调度模式,创建调度池构造器,使用该调度池构造器创建调度池(调度池模块的源码解析看本人另一篇博客)

当TaskSchedulerImpl初始化后,在sparkContext中调用TaskSchedulerImpl的start()方法

由上图可知,当应用不是在Local模式下,并且设置了推断执行,则会启动一个默认为100ms(可通过spark.speculation.interval进行修改)的定时器检查可推断任务。如果检查到有可推断任务,则调用Backend的reviveOffers方法进行资源分配。

3、TaskSchedulerImpl与Task的提交

DAGScheduler将Stage中各个分区的Task的封装为TaskSet后,会将TaskSet交给TaskSchedulerImpl处理,TaskSchedulerImpl的submitTasks方法是这个程序的入口。

上述代码  主要做了就是

1、创建TaskSetManager

2、在taskSetsByStageIdAndAttempt中设置TaskSet关联的Stage、Stage尝试次数以及刚创建的TaskSetManager的三级映射

3、将刚创建的TaskSetManager添加到调度池构造器的调度池中

4、调用SchedulerBackend的reviveOffers方法给Task分配资源

4、TaskSchedulerImpl与资源分配

localSchedulerBackend的reviveOffers方法实际上是向LocalEndpoint发送了一个ReviveOffers消息

LocalEndpoint收到了ReviveOffers方法后,调用自己的reviveOffers方法

其中LocalEndpoint的reviveOffers方法会调用TaskSchedulerImpl的resourceOffers()方法给task分配资源

调用TaskSchedulerImpl的exeuctorAdded方法向DAGScheduler的DAGSchuduler的DAGScheduler  EventProcessLoop投递ExecutorAdded事件

遍历TaskSetManager,按照最大本地性原则(即从高到低本地性级别)调用resourceOfferSingleTaskSet给单个TaskSet中的Task提供资源。如果在任何TaskSet所运行的本地性级别下,TaskSet中没有任何一个任务获得了资源,那么将调用TaskSetManager的abortIfCompeletelyBlacklisted方法,放弃在黑名单中的Task。

最终返回生成的TaskDescription列表。

调用resourceOfferSingleTaskSet给单个TaskSet中的Task提供资源

resourceOfferSingleTaskSet方法将遍历WorkerOffer序列,对每个WorkerOffer执行以下操作:

1)获取WorkerOffer的Executor的身份标识,获取Worker的Host

2)如果WorkerOffer的可用的CPU核数大于等于CPUS_PER_TASK,则执行以下操作

     1、调用TaskSetManager的resourceOffer方法给符合条件的的待处理Task创建TaskDescription

     2、将TaskDescription添加到tasks数组

     3、更新Task的身份标识与TaskSet、Executor的身份标识相关的缓存映射

     4、WorkOffer的可用的CPU核数减去CPU_PER_TASK

     5、返回launchedTask,即是否已经给TaskSet中的某个Task分配到了资源

5、TaskSchedulerImpl对执行结果的处理

Task在执行的时候会不断的发送StatusUpdate消息,在Local模式下,LocalEndpoint接收到StatusUpdate消息后,会先匹配TaskSchedulerImpl的statusUpdate方法,然后调用reviveOffers方法给其他Task分配资源。

TaskSchedulerImpl的statusUpdate方法用于更新Task的状态。Task的状态包括:运行中(RUNNING)、已完成(FINISHED)、失败(FAILED)、被杀死(KILLED)、丢失(LOST)五种

1)如果要更新的任务状态是LOST,那么从taskIdToExecutorId中获取对应的Executor的身份标识,如果此Executor上正在运行Task,那么调用removeExecutor方法移除Executor,移除的原因是是SlaveLost

2)如果要更新的任务状态是完成状态(包括FINISHED、FAILED、KILLED、LOST)那么首先调用cleanupTaskState方法,清除在taskIdToTaskSetManager、TaskIdToExecutor等缓存中的数据,然后调用TaskSetManager的removeRunningTask方法,减少正在运行的任务数量。如果状态是FINISHED,则调用TaskResultGetter的enqueueSuccessfulTask方法,对执行成功的结果进行处理,如果任务状态是FAILED、KILLED、LOST三者中的一种,则调用TaskResultGetter的enqueueSuccessfulSuccess方法,对失败的结果进行处理。

3)如果failedExecutor设置了Executor的身份标识,说明此Executor已经被移除,那么此Executor上正在运行的Task需要得到妥善的安置,安置的办法是,首先调用DAGScheduler的executorLost方法,将调用DAGScheduler的handleExecutorLost方法对丢失的Executor作进一步的处理。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: