Spark源码剖析——SparkContext的初始化_创建任务调度器TaskScheduler

Posted swordfall

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark源码剖析——SparkContext的初始化_创建任务调度器TaskScheduler相关的知识,希望对你有一定的参考价值。

5. 创建任务调度器TaskScheduler

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

技术分享图片

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

技术分享图片

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的实现见代码:

技术分享图片

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的主要内容,如果未能解决你的问题,请参考以下文章

Spark源码剖析——SparkContext

Spark实战_SparkContext原理剖析与源码分析

Spark源码剖析——SparkContext的初始化_创建任务调度器TaskScheduler

Spark源码剖析——SparkContext的初始化_TaskScheduler的启动

Spark源码剖析——SparkContext的初始化_创建和启动DAGScheduler

Spark源码剖析——SparkContext的初始化_Hadoop相关配置及Executor环境变量