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

Spark缓存--cache方法

在Spark 中,cache() 是用于优化计算性能的核心方法之一,但它有许多细节需要深入理解。以下是关于 cache() 的详细技术解析:


1. cache() 的本质

  • 简化的 persist()cache() 是 persist(StorageLevel.MEMORY_ONLY) 的快捷方式,将数据以反序列化对象的形式存储在内存中。

  • 惰性操作:调用 cache() 后,数据不会立即缓存,只有在首次触发行动操作(如 count()show()collect())时才会执行缓存。

  • 存储级别:默认使用 MEMORY_ONLY,若内存不足,未缓存的分区会在后续需要时重新计算。


2. 底层工作原理

缓存过程
  1. 血缘(Lineage)记录:Spark 记录 RDD/DataFrame 的血缘关系(即生成该数据的操作步骤)。

  2. 首次计算:当首次触发行动操作时,Spark 根据血缘执行计算,并将结果按分区缓存在内存中。

  3. 后续复用:后续操作直接读取缓存数据,跳过血缘中的计算步骤。

缓存失效
  • 手动释放:调用 unpersist() 立即释放缓存。

  • 自动清理:Spark 根据 LRU(最近最少使用)策略自动清理缓存,当内存不足时,最早未使用的缓存分区会被移除。


3. 存储级别的关键细节

cache() 对应的 MEMORY_ONLY 存储级别特性:

特性说明
序列化数据以反序列化 Java 对象形式存储,读写速度快,但内存占用高。
内存溢出处理内存不足时,直接丢弃未缓存的分区,后续需要时重新计算(不会写入磁盘)。
容错性缓存数据丢失时(如节点故障),Spark 根据血缘重新计算。

4. 何时使用 cache()

适用场景
  • 重复使用:同一数据集被多次用于不同操作(如多阶段机器学习流水线)。

  • 迭代计算:如 PageRank、梯度下降等需要多次遍历数据的算法。

  • 交互式分析:在 Spark Shell 中多次查询同一数据集。

不适用场景
  • 单次使用:数据仅用一次时,缓存反而浪费资源。

  • 内存不足:数据远大于可用内存时,MEMORY_ONLY 会导致频繁重计算,应改用 MEMORY_AND_DISK

代码示例

// 使用 cache 的情况

    val cachedRDD = largeRDD.map(complexTransformation).cache()

   

    // 第一次触发行动算子,计算并统计时间

    val startTime3 = System.currentTimeMillis()

    val result3 = cachedRDD.collect()

    val endTime3 = System.currentTimeMillis()

    println(s"使用 cache 第一次计算耗时: ${endTime3 - startTime3} 毫秒")

    // 第二次触发行动算子,计算并统计时间

    val startTime4 = System.currentTimeMillis()

    val result4 = cachedRDD.collect()

    val endTime4 = System.currentTimeMillis()

    println(s"使用 cache 第二次计算耗时: ${endTime4 - startTime4} 毫秒")

    println(s"spark.local.dir 的值: ${conf.get("spark.local.dir")}")

    sc.stop()

http://www.xdnf.cn/news/334927.html

相关文章:

  • leetcode 3342. 到达最后一个房间的最少时间 II 中等
  • ​无线手持吸尘器无刷BLDC驱动方案功能介绍---【其利天下】
  • Crawl4AI:高效的开源 Python 网页爬取与数据提取库
  • php java go python面向对象的设计原则和常用设计模式
  • 构建高可维护、易测试的异步任务系统:基于 Celery + Redis + Eventlet 的模块化架构实践
  • AI日报 · 2025年5月08日|Stripe发布全球首个支付AI基础模型
  • 论坛系统开发(0-1) (上 前置知识介绍)
  • 解锁跨平台开发的新时代——Compose Multiplatform
  • Python3 上下文管理器:优雅管理资源的艺术
  • JVM运行时数据区域(Run-Time Data Areas)的解析
  • Linux系统管理与编程15:vscode与Linux连接进行shell开发
  • HTTP Error 500.31 - Failed to load ASP.NET Core runtime
  • GuPPy-v1.2.0安装与使用-生信工具52
  • Asp.Net Core IIS发布后PUT、DELETE请求错误405
  • Docker封装深度学习模型
  • 从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践
  • Linux:libc库简单设计
  • Java响应实体【R】
  • JavaScript 性能优化全攻略:从基础到实战
  • PDF生成模块开发经验分享
  • element MessageBox 实现底部三个按钮或者更多按钮—开箱即用
  • Spring Cloud:概述,服务注册和服务发现,多机部署和负载均衡
  • 二本计算机,毕业=失业?
  • 【Rust】结构体
  • 【算法学习】递归、搜索与回溯算法(二)
  • 计算机网络:深入分析三层交换机硬件转发表生成过程
  • 为了摸鱼和吃瓜,我开发了一个网站
  • 酒店客房拖鞋材质款式多样,对顾客入住感受影响大
  • 面试实践AND面经热点题目总结
  • 紫禁城多语言海外投资理财返利源码带前端uniapp纯工程文件