核心要点

  • RDD 是弹性分布式数据集:不可变、可分区、靠血缘(lineage)容错、转换惰性求值

  • DAG 是逻辑执行计划,按宽依赖边界切分为多个 Stage,遇 action 才触发实际计算

  • 窄依赖:父分区被一个子分区使用(map/filter),可在同一 Stage 内流水线执行

  • 宽依赖:父分区被多个子分区使用(groupByKey/reduceByKey/join),跨节点 Shuffle

标准回答

RDD:抽象与容错

RDD(Resilient Distributed Dataset)是 Spark 的底层抽象,特点是不可变、分区存储、惰性求值。它不持久化中间数据,而是记录由父 RDD 推导而来的转换序列(血缘)。某分区丢失时,按血缘重算该分区即可恢复,无需全量备份。

DAG 与 Stage 划分

每个 action(如 count、collect)会向 DAGScheduler 提交一张有向无环图。调度器从后往前遍历,以宽依赖为边界切分 Stage:窄依赖归入同一 Stage 做流水线,宽依赖则断开并产生 Shuffle。Stage 内进一步拆成 Task 下发到 Executor。

宽依赖 vs 窄依赖

窄依赖(map、filter、union)父子分区一对一或多对一,无需跨节点移动数据,失败重算代价小。宽依赖(groupByKey、reduceByKey、join)需要按 key 重分布数据,产生 Shuffle,是性能与容错的关键瓶颈。上层 DataFrame 由 Catalyst 优化器生成更优的物理计划。

常见误区

⚠️ 常见踩坑

常误以为 transformation 会立即执行;实际是惰性的,只有 action 才触发。也勿把宽依赖等同于 join,map 也可能在特定算子下产生 Shuffle,判断标准是分区间是否需要重分布。

追问

追问 1RDD 的血缘容错和 Checkpoint 有什么区别?

血缘靠重算父 RDD 恢复,链路过长会重算成本高且占内存。Checkpoint 把 RDD 物化到可靠存储(如 HDFS)并截断血缘,适合迭代多、链路长的场景,但需额外 IO。两者常配合:cache 加速、checkpoint 兜底。

追问 2DataFrame 相比 RDD 为什么更快?

DataFrame 有 Schema,经 Catalyst 优化器做谓词下推、列裁剪、常量折叠等优化,并通过 Tungsten 做堆外内存与代码生成。RDD 对引擎是黑盒,无法做这类优化,所以同样逻辑 DataFrame 通常更快。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。