请阐述 Spark 中 Transformation 操作与 Action 操作各自的定义,并说明它们在执行机制上的核心差异。
考察说明
考查对 Spark 计算模型中最基本操作类型的理解,以及能否说清惰性求值与作业触发的执行机制。
回答思路
- 【回答框架 1】Transformation 是对 RDD 等分布式数据集的转换操作,例如 map、filter、flatMap、reduceByKey。它定义新的数据集但不会立即执行计算,而是构建成有向无环图(DAG)形式的血缘关系,具有惰性求值特性,多个 Transformation 会合并到同一个作业中执行。
- 【回答框架 2】Action 是触发实际计算的算子,例如 collect、count、saveAsTextFile、foreach。调用 Action 会提交作业,从 DAG 的源头开始计算,并产生结果返回给驱动程序或写出外部存储,Action 的每一次调用都会生成一个新的作业。
- 【回答框架 3】两者的区别主要在触发时机和返回类型:Transformation 返回新的数据集且不触发计算,Action 返回值或输出且触发计算。同时惰性执行能让 Spark 通过血缘关系和 DAG 优化器对计算流水线进行优化,减少不必要的中间数据物化。
- 【关键点 1】Transformation 是惰性的,只构建血缘 DAG,不触发作业执行。
- 【关键点 2】Action 是触发点,每次调用都会提交一个作业并执行计算。
- 【关键点 3】Transformation 返回新数据集,Action 返回结果或写入外部系统。
- 【易错点 1】不要认为窄依赖与宽依赖是 Transformation 与 Action 的差异,它们是依赖类型的两类划分。
- 【易错点 2】不要误认为 Action 只能触发现有 DAG 的计算,每个 Action 实际是重新提交作业,因此重复 Action 会导致重复计算。
- 【易错点 3】不要混淆惰性求值一定会减少计算量,具体优化效果还取决于血缘设计、缓存和 DAG 剪枝。