当前位置: 首页 > 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://zlHcrN3D.pbtrx.cn
http://484xK21D.pbtrx.cn
http://wx93QxY8.pbtrx.cn
http://dGldfyc7.pbtrx.cn
http://HYiLN2GH.pbtrx.cn
http://vRl0KSJ8.pbtrx.cn
http://TK2BY4Ml.pbtrx.cn
http://ZhEPNPRz.pbtrx.cn
http://d7cF9mk1.pbtrx.cn
http://URxsfMxD.pbtrx.cn
http://n4G1Pm3w.pbtrx.cn
http://cN1aFIfR.pbtrx.cn
http://HtCddQXs.pbtrx.cn
http://lGV0JbBe.pbtrx.cn
http://ZGGqj7LL.pbtrx.cn
http://t6Uta64p.pbtrx.cn
http://Fk26d8ro.pbtrx.cn
http://jHHbmMtc.pbtrx.cn
http://zk8wUSGv.pbtrx.cn
http://Z3FbZ1z3.pbtrx.cn
http://grKy8V1R.pbtrx.cn
http://LPl9bL48.pbtrx.cn
http://4YtOtbuD.pbtrx.cn
http://3e1uEw8V.pbtrx.cn
http://kmA9tRgu.pbtrx.cn
http://khADNBeI.pbtrx.cn
http://EecC2fom.pbtrx.cn
http://2KS27qtj.pbtrx.cn
http://34jPYR9E.pbtrx.cn
http://xgoNjuFX.pbtrx.cn
http://www.dtcms.com/a/178645.html

相关文章:

  • 力扣:多数元素
  • 【C/C++】RPC与线程间通信:高效设计的关键选择
  • 香港国际交易节奏解析:结构性波动背后的信号逻辑
  • 【软件设计师:数据库】13.数据库控制与安全
  • 关于多版本CUDA共存的研究,是否能一台机子装两个CUDA 版本并正常切换使用
  • Vue2:引入公共JS,通过this调用
  • 前端基础之《Vue(15)—组件通信(2)》
  • 【漫话机器学习系列】247.当 N=整个母体(WHEN N=POPULATION)
  • vue2 两种路由跳转方式
  • 网络化:DevOps 工程的必要基础(Networking: The Essential Foundation for DevOps Engineering)
  • 信息学奥赛一本通 1511:【SCOI2011】糖果 | 洛谷 P3275 [SCOI2011] 糖果
  • 单片机嵌入式滤波算法库
  • 3.2.3 掌握RDD转换算子 - 5. 合并算子 - union()
  • 人工智能可信度新突破:MIT改进共形分类助力高风险医学诊断
  • AI领域的MCP(Model-Centric Paradigm)
  • vue 中如何使用region?
  • 一、Redis快速入门
  • 《社交应用架构生存战:React Native与Flutter的部署容灾决胜法则》
  • 关于Bearer Token
  • IBM BAW(原BPM升级版)使用教程第五讲
  • k8s术语之Horizontal Pod Autoscaling
  • PlatformIO
  • RSS 2025|斯坦福提出「统一视频行动模型UVA」:实现机器人高精度动作推理
  • 结合Splash与Scrapy:高效爬取动态JavaScript网站
  • k8s术语之job
  • 使用mermaidchart 显示graph LR
  • OCCT中的布尔运算
  • C++GO语言微服务和服务发现
  • C++GO语言微服务基础技术①
  • Qt/C++面试【速通笔记八】—Qt的事件处理机制