DAGScheduler 是面向调度阶段的任务调度器,负责接收 Spark 应用提交的作业,根据 RDD 的依赖关系划分调度阶段,并提交调度阶段给 TaskScheduler。
下面的代码是SparkContext实例化DAGScheduler的过程:
@volatile private[spark] var dagScheduler: DAGScheduler = _
try {
dagScheduler = new DAGScheduler(this)
} catch {
case e: Exception => {
try {
stop()
} finally {
throw new SparkException("Error while constructing DAGScheduler", e)
}
}
}
下面代码显示了DAGScheduler的构造函数定义中,通过绑定TaskScheduler的方式创建,其中次构造函数去调用主构造函数来将sc的字段填充入参:
private[spark]
class DAGScheduler(
private[scheduler] val sc: SparkContext,
private[scheduler] val taskScheduler: TaskScheduler,
listenerBus: LiveListenerBus,
mapOutputTracker: MapOutputTrackerMaster,
blockManagerMaster: BlockManagerMaster,
env: SparkEnv,
clock: Clock = new SystemClock())
extends Logging {
def this(sc: SparkContext, taskScheduler: TaskScheduler) = {
this(
sc,
taskScheduler,
sc.listenerBus,
sc.env.mapOutputTracker.asInstanceOf[MapOutputTrackerMaster],
sc.env.blockManager.master,
sc.env)
}
def this(sc: SparkContext) = this(sc, sc.taskScheduler)
作业提交与DAGScheduler操作
Action的大部分操作会进行作业(job)的提交,源码1.0版的job提交过程的大致调用链是:sc.runJob()
-->dagScheduler.runJob
-->dagScheduler.submitJob
--->dagSchedulerEventProcessActor.JobSubmitted
-->dagScheduler.handleJobSubmitted
-->dagScheduler.submitStage
-->dagScheduler.submitMissingTasks
-->taskScheduler.submitTasks
。
DAGScheduler的runJob函数
DAGScheduler.runjob最后把结果通过resultHandler保存返回。
这里DAGScheduler的runJob函数调用DAGScheduler的submitJob函数来提交任务