SparkCore——详述Spark作业调度
前言
我们在之前的博客中讲过,TaskScheduler负责每个具体任务的实际物理调度,DAGScheduler负责将作业拆分成为不停阶段的具体有依赖关系的多批任务,可以理解为DAGScheduler负责任务的逻辑调度。
本篇博客,结合这段时间看过的一些书籍,南国在这里重点回顾一下Spark中作业调度的相关知识。
作业调度的顶层逻辑概述
作业调度的具体工作流程
作业调度的基本流程如下图所示:
调度阶段的拆分
构建一个新的Stage,这个新的Stage的输出结果的分区方式,则由ShuffleDependency中的Partition对象就决定。
调度阶段的提交
此外,每完成一次DAGSchduler的事件循环,也会触发一次从等待和失败列表中扫描并提交Stage的调用过程。
任务集的提交
完成状态的监控
简单来说,这是通过对外(主要是对TaskSchduler)暴露一系列的回调函数来实现的。对于TaskScheduler来说,这些回调函数主要包括任务的开始结束失败、任务集的失败,DAGSchduler根据这些任务的生命周期进一步维护作业和调度阶段的状态信息。