一、概述

一个 Spark Application 包括 Job、 Stage 以及 Task 三个概念:

  • Job

    由于 Spark 的懒执行,在 driver 调用一个action 之前,spark application 不会做任何事情。针对每个 action,Spark调度
    器就创建一个执行图(execution.graph) 并且启动一个 Spark Job。

  • stage

    每个 job 有多个 stage 组成,这些 stage 就是实现最终的RDD所需的数据转换的步骤,以 RDD 宽依赖为界,遇到宽依赖即划分 stage,

  • task

    每个 stage 由多个 tasks 组成,这些 tasks 就表示每个并行计算并且会在多个执行器上执行

在 Spark 中,调度执行一个Job 总体分两路进行: Stage 级的调度和 Task 级的调度~

任务调度模块作为 Spark Core 的核心模块之一,充分地体现了与 MapReduce 完全不同的设计思想,主要包含两大部分,即 DAGScheduler和 TaskScheduler,它们负责将用户提交的计算任务按照DAG划分为不同的阶段并且将不同阶段的计算任务提交到集群进行最终的计算。

二、Job 触发

三、Stage 级调度

Spark 中 DAGScheduler 实现了面向 stage 的调度

四、SchedulerBackend

SchedulerBackend 是一个 trait,负责分配当前可用的资源,具体就是向当前等待分配计算资源的 Task 分配计算资源(即 Executor),并且在分配的Executor 上启动 Task,完成计算的调度过程。

每个 SchedulerBackend 都会对应一个的唯一 TaskScheduler,而它们都被 SparkContext 创建和持有。

五、Task 级调度

任务调度器 TaskScheduler 定义了对任务进行调度的规范,允许向Spark调度系统插入不同的TaskScheduler实现,但目前只
有 TaskSchedulerImpl 这一个具体实现。