任务调度器TaskScheduler定义了对任务进行调度的接口规范,允许向Spark调度系统插入不同的TaskScheduler实现,但目前只有TaskSchedulerImpl这一个具体实现。TaskScheduler只为单个Driver调度任务。TaskSchedulerImpl的功能包括接收DAGScheduler给每个Stage创建的Task集合,按照调度算法将资源分配给Task,将Task交给Spark集群不同节点上的Executor运行,在这些Task执行失败时进行重试,通过推断执行减轻落后的Task对整体作业进度的影响。
Spark的资源调度为分两层:
- 第一层是ClusterManager(在YARN模式下为ResourceManager,在Mesos模式下为MesosMaster,在Standalone模式下为Master)将资源分配给Application
- 第二层是Application进一步将资源分配给Application的各个Task。TaskSchedulerImpl中的资源调度就是第二层的资源调度
1 TaskSchedulerImpl的属性
- maxTaskFailure:任务失败的最大次数
- isLocal:是否是Local部署模式
- SPECULATION_INTERVAL_MS:任务推断执行的时间间隔。可以通过spark.speculation.interval属性进行配置,默认为100ms
- MIN_TIME_TO_SPECULATION:用于保证原始任务至少需要运行的时间。
- taskResultGetter:类型为TaskResultGetter,它的作用是通过线程池(此线程池由Executors.newFixedThreadPool创建,大小默认为4,生成的线程名以task-result-getter开关),对Slave发送的Task的执行结果进行处理
2 TaskSchedulerImpl的初始化
用于对TaskSchedulerImpl进行初始化
//org.apache.spark.scheduler.TaskSchedulerImpl
def initialize(backend: SchedulerBackend) {
this.backend = backend
rootPool = new Pool("", schedulingMode, 0, 0)
schedulableBuilder = {
schedulingMode match {
case SchedulingMode.FIFO =>
new FIFOSchedulableBuilder(rootPool)
case SchedulingMode.FAIR =>
new FairSchedulableBuilder(rootPool, conf)
case _ =>
throw new IllegalArgumentException(s"Unsupported spark.scheduler.mode: $schedulingMode")
}
}
schedulableBuilder.buildPools()
}
- 1)使用参数传递的SchedulerBackend设置TaskSchedulerImpl的backend属性
- 2)创建根调度池
- 3)根据调度模式,创建相应的调度池构建器。
- 4)调用调度池构建器buildPools方法构建调度池
3 TaskSchedulerImpl的启动
启动任务调度器是通过其start方法实现的。TaskSchedulerImpl的start方法的实现如下:
override def start() {
backend.start()
if (!isLocal && conf.getBoolean("spark.speculation", false)) {
logInfo("Starting speculative execution thread")
speculationScheduler.scheduleAtFixedRate(new Runnable {
override def run(): Unit = Utils.tryOrStopSparkContext(sc) {
checkSpeculatableTasks()
}
}, SPECULATION_INTERVAL_MS, SPECULATION_INTERVAL_MS, TimeUnit.MILLISECONDS)
}
}

本文详细解析了Spark的TaskScheduler模块,介绍了TaskSchedulerImpl作为唯一实现,如何接收DAGScheduler的任务集,按照调度算法分配资源,处理任务执行与重试,以及通过推断执行策略优化落后任务。

3919

被折叠的 条评论
为什么被折叠?



