DAGScheduler将任务提交到TaskScheduler之后,接下来由TaskScheduler负责任务的调度。
TaskScheduler是一个trait(接口类),它的实现类是TaskSchedulerImpl。具体内容包括:
1、出现shuffle输出lost要报告fetch failed错误
2、碰到straggle任务需要放到别的节点上重试
3、为每个TaskSet维护一个TaskSetManager
TaskScheduler与其他类之间的关系如下图中所示:
SparkContext初始化的同时会创建TaskScheduler和DAGScheduler。也就是说TaskScheduler为某个特定的SparkContext调度task。
SparkContext创建过程中会调用createTaskScheduler函数来启动TaskScheduler任务调度器:
createTaskScheduler函数中,TaskScheduler会根据部署方式而选择不同的SchedulerBackend来处理。针对不同的部署方式会有不同的TaskScheduler与SchedulerBackend进行组合:
Local模式:TaskSchedulerImpl+LocalBackend
Spark集群模式:TaskSchedulerImpl+SparkDepolySchedulerBackend
Yarn-cluster模式:YarnClusterScheduler+CoarseGrainedSchedulerBackend
Yarn-Client模式:YarnClientClusterScheduler+YarnClientSchedulerBackend
SchedulerBackend是Spark中一个可插拔组件。按照字面意思,它就是调度器的一个后台服务或者实现,其主要作用就是在物理机器或者说worker就绪后,能够提供其上的资源并将tasks加载到那些机器或者worker上。
以Standalone模式为例,backend根据不同的部署方式实例化,后又作为scheduler对象的一个成员变量对scheduler调用initialize函数: