Spark DataFrame中checkpoint(false)为何比persist()执行效率更高?
为什么非急切模式checkpoint(false)效率高于默认persist()
这是二者的存储逻辑、执行策略与测试数据集的特性共同作用的结果,核心原因有三点:
- 触发时机与查询裁剪更高效
非急切的checkpoint(false)不会在调用时立刻触发计算,会等到第一个Action(groupBy(Role).collect())执行时才真正触发数据落盘。此时Spark的查询优化器已经完成了列裁剪、谓词下推,仅保留符合过滤条件的行与计算需要的字段,进一步缩小了需要持久化的数据量。 - 默认
persist()的缓存开销高、易失效
Spark无参cache()/persist()默认使用MEMORY_ONLY存储级别,存储的是未序列化的Java对象。你的数据集包含超长字符串类型的Name列,未序列化存储的内存占用极高,很容易出现Executor内存不足、部分分区缓存失败的情况。执行第二个Action(groupBy(Born).collect())时,缓存失败的分区需要重新执行上游过滤逻辑,会引入额外的重算开销。 - Checkpoint自身的机制优势
Checkpoint默认写入序列化后的高压缩率Parquet格式,哪怕需要写入磁盘,实际写入的数据量远小于MEMORY_ONLY存储的未序列化对象体积。同时Checkpoint完成后会彻底切断DataFrame的血缘依赖,第二个Action执行时可以直接读取Checkpoint的磁盘文件,不需要回溯上游计算逻辑,也不存在缓存失效重算的问题。
内容的提问来源于stack exchange,提问作者Mardaunt
相关产品推荐
相关产品推荐

