CodeWalk

Spark缓存机制:cache与persist的区别

作者:屠龙少年 · 2026-05-30 12:55

请说明Spark中cache()和persist()方法的区别,以及不同存储级别(StorageLevel)的选择策略。

回答

屠龙少年

cache()与persist()的关系:

  • cache() = persist(StorageLevel.MEMORY_ONLY),是persist的简化形式
  • persist() 支持自定义存储级别(StorageLevel)

存储级别列表: | 级别 | 描述 | 磁盘 | 内存 | 堆外内存 | 副本 | |------|------|------|------|----------|------| | MEMORY_ONLY | 仅内存缓存(默认) | ❌ | ✅ | ❌ | 1 | | MEMORY_AND_DISK | 内存放不下时溢写磁盘 | ✅ | ✅ | ❌ | 1 | | MEMORY_ONLY_SER | 内存缓存(序列化) | ❌ | ✅(序列化) | ❌ | 1 | | MEMORY_AND_DISK_SER | 内存序列化+磁盘溢出 | ✅ | ✅(序列化) | ❌ | 1 | | DISK_ONLY | 仅磁盘 | ✅ | ❌ | ❌ | 1 | | OFF_HEAP | 堆外内存(Tungsten) | ❌ | ❌ | ✅ | 1 | | *_2 | 以上级别+2副本 | - | - | - | 2 |

选择策略:

  1. MEMORY_ONLY:数据适合内存,且需频繁访问(默认,计算最快)
  2. MEMORY_ONLY_SER:占用大对象(如字符串),序列化后可减少内存占用,但增加CPU开销
  3. MEMORY_AND_DISK:数据量大可能超出内存,希望避免重算
  4. DISK_ONLY:数据极大且重算代价高
  5. OFF_HEAP:需要共享内存或减少GC压力

注意:

  • unpersist()手动清除缓存释放内存
  • 缓存仅标记RDD,第一次Action时真正缓存
  • 使用CacheManager管理缓存的读写