Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler

时间:2022-12-17 14:33:04

5. 创建任务调度器TaskScheduler

TaskScheduler也是SparkContext的重要组成部分,负责任务的提交,并且请求集群管理器对任务调度。TaskScheduler也可以看作任务调度的客户端。创建TaskScheduler的代码如下:

Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler

 createTaskScheduler方法会根据master的配置匹配部署模式,创建TaskSchedulerImpl,并生成不同的SchedulerBackend。为了使读者更容易理解Spark的初始化流程,故以local模式为例,master匹配local模式的代码如下:

Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler

5.1 创建TaskSchedulerImpl

TaskSchedulerImpl的构造过程如下:

1) 从SparkConf中读取配置信息,包括每个任务分配的CPU数、调度模式(调度模式由FAIR和FIFO两种,默认为FIFO,可以修改属性spark.scheduler.mode来改变)等。

2) 创建TaskResultGetter,它的作用是通过线程池(Executors.newFixedThreadPool创建的,默认为4个线程,线程名字以task-result-getter开头,线程工厂默认是Executors.defaultThreadFactory)对Worker上的Executor发送的Task的执行结果进行处理。

TaskSchedulerImpl的实现见代码:

Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler

TaskSchedulerImpl的调度模式有FAIR和FIFO两种。任务的最终调度实际都是落实到接口SchedulerBackend的具体实现上的。为方便分析,我们先来看看local模式中SchedulerBackend的实现LocalSchedulerBackend。LocalSchedulerBackend依赖于localEndpoint与RpcEnv进行消息通信。

5.2 TaskSchedulerImpl的初始化

创建完TaskSchedulerImpl和LocalSchedulerBackend后,对TaskSchedulerImpl调用方法initialize进行初始化。以默认的FIFO调度为例,TaskScheduler的初始化过程如下:

1) 使TaskSchedulerImpl持有LocalSchedulerBaskend的引用。

2) 在TaskSchedulerImpl的initialize方法里创建Pool,Pool中缓存了调度队列、调度算法及TaskSetManager集合等信息。

3) 创建FIFOSchedulableBuilder或FairSchedulableBuilder,用来操作Pool中的调度队列。

initialize方法的实现如下:

Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler