请描述在 Apache Spark 中,DAG(有向无环图)的生成过程,以及它在整个任务调度流程中扮演的角色是什么?
考察说明
考察对 Spark 核心调度机制中 DAG 生成逻辑及其在任务调度中的功能的理解。
回答思路
- 【回答框架 1】DAG 是 Spark 根据用户编写的转换算子(如 map、filter、join 等)的执行顺序构建的有向无环图,节点表示 RDD 或 shuffle 阶段,边表示数据依赖关系。
- 【回答框架 2】生成过程从对 RDD 的转换操作开始,Spark 通过记录每个 RDD 的血统(lineage)来构建依赖图,连接 RDD 间的宽窄依赖。
- 【回答框架 3】DAG 在任务调度中的作用是确定任务划分:根据宽依赖划分 stage,stage 内划分为多个 task 并提交到集群执行,实现阶段化执行和失败恢复。
- 【回答框架 4】具体流程:用户代码构建 RDD 转换链,当遇到行动操作(action)时触发调度器,DAGScheduler 将 DAG 转换为 stage 和 task 集合,随后提交给 TaskScheduler。
- 【回答框架 5】DAG 支持容错,通过血统根据依赖关系重新计算丢失分区,实现可靠的重新执行。
- 【关键点 1】DAG 由 RDD 的转换操作构建,节点是 RDD,边表示依赖关系。
- 【关键点 2】宽依赖(如 shuffle)是划分 stage 的边界,窄依赖(如 map)则合并为一个 stage 内的 task。
- 【关键点 3】DAGScheduler 负责将 DAG 拆分为 stage 并生成任务集,TaskScheduler 负责具体任务执行。
- 【关键点 4】行动操作触发 DAG 生成和调度,生成过程由 DAGScheduler 完成。
- 【易错点 1】混淆 DAG 生成与提交时机,DAG 并非每次行动操作都重新生成,而是复用已有 RDD 定义,行动时构建执行计划。
- 【易错点 2】忽略宽窄依赖差异,误将窄依赖也划入新 stage。
- 【易错点 3】认为 DAG 直接包含物理执行细节,实际 DAG 是逻辑依赖图,物理执行由任务集完成。