订阅更新

Spark Checkpoint 和 Cache 有什么区别?

面试问 123 约 3 分钟读完 2 次阅读

本文目录
  1. 面试怎么回答
  2. Cache 服务重复计算
  3. Checkpoint 截断血缘
  4. 两者经常组合使用
  5. 别和流式 Checkpoint 混淆
  6. 为什么不能只回答概念?
  7. 落地时我会检查什么?
  8. 一个典型场景

面试怎么回答

Cache/Persist 是性能优化,数据可以丢,丢失后按 lineage 重算;Checkpoint 会把结果写入可靠存储并截断血缘,适合长 DAG、迭代计算和稳定阶段边界。实践中可以先 Persist 再 Checkpoint,避免物化时重复计算,完成后及时 Unpersist。我还会区分批处理 Checkpoint 与 Structured Streaming 保存 Offset、状态和提交日志的 Checkpoint。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

Cache 丢了可以重算,Checkpoint 丢了可能无法从原来的血缘恢复。两者都把中间结果“存起来”,解决的问题却完全不同。

一个面向性能复用,一个面向截断血缘和可靠恢复。

Cache 是可丢失的性能优化,Checkpoint 是把数据物化到可靠存储并切断上游血缘。

Cache 服务重复计算

Cache/Persist 将分区保存在内存或磁盘,后续 Action 可以复用。分区丢失时,Spark 仍可根据 lineage 重新计算,因此它不改变逻辑依赖。

Checkpoint 截断血缘

Checkpoint 会触发物化并把结果写到配置的可靠存储,之后从检查点读取,原有长血缘被截断。它适合迭代算法、超长 DAG 或需要稳定中间边界的场景。

两者核心差异

两者经常组合使用

直接 Checkpoint 可能先按完整血缘重算一次。常见做法是先 Persist,再 Checkpoint,让检查点物化复用缓存结果,完成后根据生命周期 Unpersist。

别和流式 Checkpoint 混淆

批处理 RDD/DataFrame 的 Checkpoint 主要处理血缘;Structured Streaming Checkpoint 还保存 Offset、状态和提交日志,用于流任务故障恢复,语义不能混为一谈。

为什么不能只回答概念?

“误区:Checkpoint 只是更可靠的 Cache”之所以常见,是因为它在理想数据和单次执行里往往说得通。但生产环境会加入数据规模、异常值、并发、版本、失败重试和下游口径,这些条件一变化,只记住术语就很容易给出错误结论。

所以我会把 Cache 服务重复计算、Checkpoint 截断血缘、两者经常组合使用、别和流式 Checkpoint 混淆 串成一条完整链路。最终判断标准不是某个函数或配置是否出现,而是能否稳定得到可解释、可验证、可恢复的业务结果。

落地时我会检查什么?

  • 输入边界:确认数据范围、时间口径、主键和异常值是否符合假设。
  • 执行过程:观察分区、并行度、状态、Shuffle 或资源变化,验证方案是否真正生效。
  • 输出结果:用行数、唯一性、关键指标和样本明细证明结果正确,而不是只看任务成功。
  • 失败恢复:说明重跑、回滚、版本兼容和责任人,避免一次成功后无人维护。

这些检查不一定全部写进一条 SQL 或一个任务,但面试时能主动补充,说明你回答的不是背诵题,而是在描述一套可上线的工程方案。

一个典型场景

一个迭代任务每轮都从上一轮 DataFrame 派生,DAG 越来越长。团队只加 Cache,内存压力上升后缓存频繁淘汰,故障重算仍要走完整血缘。改为在阶段边界 Persist 后 Checkpoint,并及时释放旧缓存,调度图和恢复路径才真正缩短。

Cache 减少重复算,Checkpoint 减少需要追溯的依赖。

刷题进度保存在当前浏览器