Spark Directed Acyclic Graph (DAG) 是 Apache Spark 中的核心概念,它用于描述作业(job)的计算逻辑。在 Spark 中,用户通过对 RDD(Resilient Distributed Datasets)的操作构建一系列转换和动作,这些操作会形成一个有向无环图结构。
DAG 的构成:
-
节点(Vertices):DAG 中的每个节点代表了对数据的一次转换或动作。在 Spark 中,转换如
map()
,filter()
,join()
等函数应用于 RDD 时创建新的节点;而动作如reduce()
,collect()
,count()
等触发执行并返回结果给驱动程序的动作也作为节点。 -
边(Edges):DAG 中的边表示节点间的依赖关系。如果一个节点的输出是另一个节点的输入,则它们之间存在一条边。例如,在连续调用两次转换操作
rdd.map(...).filter(...)
时,map
节点到filter
节点就有一条依赖边。
DAG 的作用:
- 优化执行计划:Spark 的 DAGScheduler 根据 DAG 来进行任务调度和优化,合并多个连续的转换操作为更少的阶段(stage),每个阶段内部的任务可以并行执行。
- 容错性:由于 DAG 描述了完整的计算过程和依赖关系,当某个任务失败时,Spark 可以根据 DAG 重新计算丢失的数据,实现容错处理。
- 高效执行:通过分析 DAG,Spark 能够识别出 Shuffle 操作等瓶颈阶段,并提前进行资源分配和优化。
执行流程:
- 用户提交一个 Spark 应用程序,其中包含了一系列的 RDD 转换和动作操作。
- Spark 将这些操作组织成一个 DAG。
- DAGScheduler 将 DAG 分解成一序列的 stage,每个 stage 包含一组可以并行运行的任务。
- TaskScheduler 将任务分发到集群中的各个工作节点(executor)上执行。
- 当遇到 Shuffle 操作时,Spark 会在不同阶段之间执行实际的数据交换和分区。
- 执行完所有阶段后,最终的结果返回给驱动器(driver)程序。