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

【赵渝强老师】Spark RDD的缓存机制

在这里插入图片描述

Spark RDD通过persist方法或cache方法可以将计算结果的缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD才会被缓存在计算节点的内存中并供后面重用。下面是persist方法或cache方法的函数定义:

def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
def cache(): this.type = persist()
视频讲解如下

【赵渝强老师】Spark RDD的缓存机制

通过函数的定义发现,cache最终也是调用了persist方法,默认的存储级别都是仅在内存存储一份,Spark在object StorageLevel中定义了缓存的存储级别。下面是在StorageLevel中的定义的缓存级别。

val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2=new StorageLevel(true, true, false, false, 2)
valOFF_HEAP = new StorageLevel(true, true, true, false, 1)

需要说明的是,使用RDD的缓存机制,数据可能丢失;或者会由于内存的不足而造成数据被删除。可以通过使用RDD的检查点机制了保证缓存的容错,即使缓存丢失了也能保证计算的正确执行。

下面是使用RDD缓存机制的一个示例。这里使用RDD读取一个大的文件,该文件中包含918843条记录。通过Spark Web Console可以对比出在不使用缓存和使用缓存时,执行效率的差别。
(1)读取一个大文件。

scala> val rdd1 = sc.textFile("/root/temp/sales")

(2)触发一个计算,这里没有使用缓存。

scala> rdd1.count

(3)调用cache方法标识该RDD可以被缓存。

scala> rdd1.cache

(4)第二次触发计算,计算完成后会将结果缓存。

scala> rdd1.count

(5)第三次触发计算,这里会直接从之前的缓存中获取结果。

scala> rdd1.count

(6)访问Spark的Web Console观察这三次count计算的执行时间,可以看成最后一次count计算只耗费了98ms,如下图所示。
在这里插入图片描述

《从大数据到云原生系列课程》

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

相关文章:

  • Docker 部署AnythingLLM
  • Maven教程
  • QT QLabel加载图片等比全屏自适应屏幕大小显示
  • 阿里云虚机的远程桌面登录提示帐户被锁定了
  • 一文看常见的消息队列对比
  • 南凌科技接入deepseek大模型,提升云网智安服务能力
  • MySQL日常维护工具------备份
  • 北京青蓝智慧科技:LCCI ESG的从业方向
  • 提升信息检索准确性和效率的搜索技巧
  • Fastgpt学习(5)- FastGPT 私有化部署问题解决
  • 【java基础】Java 中的 this 关键字
  • 51单片机学习之旅——在LCD1602上显示时钟
  • PHP 流程控制与错误处理
  • CSS中五种定位方式(position)对比分析
  • “深入浅出”系列之C++:(23)C++接入Deepseek
  • 【EndNote】WPS 导入EndNote 21
  • 论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding
  • macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能
  • Oracle 12c中在同一组列上创建多个索引
  • nginx ngx_stream_module(3) 指令详解
  • 深度学习中通道数的理解
  • very强烈的小病毒
  • qt:按钮的常见操作(简单方向键项目)
  • 【Web前端开发精品课 HTML CSS JavaScript基础教程】第二十四章课后题答案
  • Python操作MySQL
  • 索引以及索引底层数据结构
  • 【Elasticsearch】Retrieve inner hits获取嵌套查询的具体的嵌套文档来源,以及父子文档的来源
  • leetcode203.移除链表元素
  • 幂等与分布式锁的区别及应用场景
  • 前端自动化部署的极简方案