RDD持久化:缓存与检查点的深度解析
在 Spark 中,RDD 本身不存储数据,每次行动算子触发时都会重新计算整个依赖链。当需要重复使用 RDD 或应对节点故障时,持久化机制成为提升性能和保障容错的核心手段。本文详细讲解 RDD 持久化的两种方式 —— 缓存(Cache)和检查点(Checkpoint),分析其原理、区别及最佳实践。
RDD 持久化的必要性
避免重复计算
默认情况下,每个行动算子(如 collect、count)都会触发从头计算 RDD 依赖链。例如,若对同一个 RDD 执行两次 count,则会重复计算所有转换算子,造成资源浪费:
1 | val rdd = sc.textFile("large_file.txt").flatMap(_.split(" ")).map((_, 1)) |
应对节点故障
当 Executor 崩溃导致 RDD 分区数据丢失时,若无持久化,Spark 需通过血缘关系(Lineage)重算整个依赖链,耗时较长。持久化可保存中间结果,减少重算成本。
缓存(Cache / Persist):内存级快速复用
缓存是最常用的持久化方式,通过 cache 或 persist 方法将 RDD 数据暂存于内存或磁盘,供后续操作快速复用。
缓存 API 与存储级别
cache() 方法
简化版缓存,内部调用persist(StorageLevel.MEMORY_ONLY),默认将数据以非序列化形式存储在内存中: