Spark-Scheduler:二、Scheduler实现概述

任务调度模块涉及了三个类:

1)org.apache.spark.scheduler.DAGScheduler

2)org.apache.spark.scheduler.SchedulerBackend

3)org.apache.spark.scheduler.TaskScheduler

 

其中1,3在上篇的图示里面有,而org.apache.spark.scheduler.SchedulerBackend是一个trait,作用是:分配当前可用的资源 ——就是给Task分配计算资源(Executor),并在分配的Executor上启动Task

 

org.apache.spark.scheduler.TaskScheduler也是一个trait,它的作用是为创建它的SparkContext调度任务,即从DAGScheduler接受不同的Stage的任务,并且向集群提交这些任务,并为执行特别慢的任务启动备份任务。TaskScheduler是以后实现多种任务调度器的基础,不过当前的org.apache.spark.scheduler.TaskSchedulerImpl是唯一实现。TaskSchedulerImpl会在以下几种场景下调用org.apache.spark.scheduler.SchedulerBackend+reviveOffers;

1)有新任务提交时。

2)有任务执行失败时。

3)计算节点(即Executor)不可用时。

4)某些任务执行慢需要重新分配资源时。

 

任务调度逻辑图

 

Spark-Scheduler:二、Scheduler实现概述
任务调度逻辑图

 

附录:因为spark是用scala语言开发的,其中对于scala的语言特性,大家要务必了解;因为你在实际开发项目中想要看源码其实都是scala语言开发的;这里ScheduleBackend和TaskSchedule都是trait,trait(特征),与abstract class相似,只是trait可以被多继承,而abstract只能单继承。(其实从字面意思理解:面向对象编程,一个对象可以包含很多特征(trait),但是对于一个抽象类其实在本质上就涵盖了该对象的所有特征,所以是不能多继承的)