版权声明:本博客都是作者10多年工作总结 https://blog.csdn.net/Peter_Changyb/article/details/82661139
TaskScheduler模块用于与DAGScheduler交互,负责任务的具体调度和运行。任务调度模块基于两个Trait:TaskScheduler和 SchedulerBackend。
TaskScheduler:定义了任务调度模块的对外接口(submitTasks等),供DAGScheduler调用。
- TaskSchedulerImpl是TaskScheduler的具体实现,完成资源与任务的调度。
- SchedulerBackend封装了各种backend,用于与底层资源调度系统交互,配合TaskSchedulerImpl实现任务执行所需的资源分配。
- SchedulableBuilder负责taskset的调度。
- TaskSetManager负责一个taskset中task的调度。
SchedulerBackend 的方法 reviveOffers
- 1,过滤出活着的Executors
- 2,新建WorkerOffer对象,调用scheduler.resourceOffers()分配资源到各个Executor上去;
- 3,分配好task到Executor上之后,执行自己的lauchTasks(),将分配的task发送launchTasks信息;
task分配算法 resourceOffers
- 移除黑名单中的node
- 将可用的Executor进行Shuffle,尽可能做到负载均衡
- 从rootpool中取出排序之后的TaskSet,sortedTaskSets
- 对于每一个taskSet,从最好的一个【本地化级别】 开始遍历,调用resourceOfferSingleTaskSet()方法实现task的分配到各个executor上
- 本地化级别分类:
- PROCESS_LOCAL : 进程本地化,RDD的Partition与task进入一个Executor内,速度最快
- NODE_LOCAL : 节点本地化,RDD的Partition与task不在一个Executor,即不在一个进程,但是在一个Worker上
- NO_PREF : 无所谓本地化级别
- RACK_LOCAL : 机架本地化,至少RDD的Partition与task在一个机架上
- ANY :任意的本地化级别
- 本地化级别分类: