当前位置: 首页 > news >正文

Spark缓存-persist和cache方法

在 Spark 中,persist 和 cache 方法都用于将 RDD(弹性分布式数据集)或 DataFrame 持久化,以避免重复计算从而提升性能,但二者存在一些区别。

1. 功能本质

persist:这是一个通用的持久化方法,能够指定多种不同的存储级别。存储级别决定了数据的存储位置(如内存、磁盘)以及存储形式(如是否序列化)。

cache:其实是 persist 方法的一种特殊情况,它等价于调用 persist(StorageLevel.MEMORY_ONLY),也就是将数据以非序列化的 Java 对象形式存储在内存中。

2. 存储级别指定

persist:可以通过传入 StorageLevel 参数来指定不同的持久化级别。常见的持久化级别有:

MEMORY_ONLY:将 RDD 以 Java 对象的形式存储在 JVM 的内存中。若内存不足,部分分区将不会被缓存,需要时会重新计算。

MEMORY_AND_DISK:优先把 RDD 以 Java 对象的形式存储在 JVM 的内存中。若内存不足,会把多余的分区存储到磁盘上。

DISK_ONLY:将 RDD 的数据存储在磁盘上。

MEMORY_ONLY_SER:将 RDD 以序列化的 Java 对象形式存储在内存中,相较于 MEMORY_ONLY,序列化后占用的内存空间更小,但读取时需要进行反序列化操作,会带来一定的性能开销。

MEMORY_AND_DISK_SER:优先将 RDD 以序列化的 Java 对象形式存储在内存中,内存不足时存储到磁盘上。

cache:不能指定存储级别,它固定使用 MEMORY_ONLY 存储级别。

常见存储级别
存储级别说明
MEMORY_ONLY默认,纯内存存储(Java 对象),速度最快。
MEMORY_ONLY_SER内存存储(序列化后),节省空间但需反序列化(推荐!)。
MEMORY_AND_DISK优先内存,不足时溢写到磁盘(Java 对象)。
MEMORY_AND_DISK_SER优先内存(序列化),不足时溢写到磁盘(推荐!)。
DISK_ONLY纯磁盘存储,适用于超大数据集。
OFF_HEAP堆外内存(Tungsten 优化),减少 GC 压力。

缓存 vs. 检查点(Checkpoint)

特性缓存 (Cache/Persist)检查点 (Checkpoint)
存储位置内存或磁盘(executor 节点)可靠存储(如 HDFS)
血统(Lineage)保留,可通过重新计算恢复丢失数据截断,检查点后不再依赖原始 RDD
成本低(仅存储计算结果)高(需写入外部存储)
用途加速多次使用的中间结果长期保存关键数据(如迭代算法的状态)
    persist的示例

    下面我们以DISK_ONLY为例,改写上面的程序,验证它的持久化效果。具体要改动的地方有两个: 指定持久化地址; 把cache改成persist;

    conf.set("spark.local.dir", "/path/to/your/local/dir")
    sc = SparkContext(conf)val cachedRDD = largeRDD.map(complexTransformation).persist(StorageLevel.MEMORY_ONLY)

    总结

    • 缓存是提升 Spark 性能的关键手段,尤其适合迭代计算和交互式分析。
    • cache() 是简化版的 persist(),默认存储在内存。
    • 合理选择存储级别(如 MEMORY_ONLY_SER)可显著节省内存并提升效率。
    • 避免过度缓存:只缓存真正需要复用的数据,防止内存溢出。

     

    http://www.dtcms.com/a/196993.html

    相关文章:

  • 前端-HTML元素
  • Raft 协议:分布式一致性算法的核心思想
  • 电动调节 V 型球阀:工业流体控制的全能解决方案-耀圣
  • HTTP与HTTPS协议的核心区别
  • 通过多线程获取VENC的H264码流数据
  • 刷leetcodehot100返航版--二叉树
  • 计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)
  • Day12-苍穹外卖(完结篇)
  • ctfshow——web入门254~258
  • 98. 验证二叉搜索树
  • 如何优化关键词长度:2025年SEO实用指南
  • 软件设计师考试《综合知识》创建型设计模式考点分析
  • SAP HCM 0008数据存储逻辑
  • 电池的充放电电流中C的含义
  • 【SpringBoot】关于MP使用中配置了数据库表前缀的问题
  • 在宝塔中使用.NET环境管理部署 .NET Core项目
  • 生产级编排AI工作流套件:Flyte全面使用指南 — Development cycle
  • mysql中limit深度分页详细剖析【爽文】
  • 架构师论文《论模型驱动架构软件开发方法及其应用》
  • 【软件测试】性能测试 —— 工具篇 LoadRunner 介绍与使用
  • Ansible模块——服务管理和设置定时任务
  • 一字典两世界:优雅移除 `NSDictionary` 指定键的最佳实践
  • 腾讯 CodeBuddy 杀入 AI 编程赛道,能否撼动海外工具霸主地位?
  • C++类与对象--2 对象的初始化和清理
  • tp5 关键词搜索商品时进行关键词拆分
  • [Linux]我在Linux世界觉醒了指令系统
  • JavaScript基础-创建对象的三种方式
  • 【C++重载操作符与转换】文本查询示例
  • 数据库故障排查指南:解决常见问题,保障数据安全与稳定
  • 数据分析_Python