RDD 的缓存-缓存级别 | 学习笔记

简介: 快速学习 RDD 的缓存-缓存级别

开发者学堂课程【大数据Spark2020最新课程(知识精讲与实战演练)第二阶段RDD 的缓存-缓存级别学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/689/detail/12000


RDD 的缓存-缓存级别


通过此章节的学习,可以了解到缓存区别,以及如何选取缓存级别,如何使用 RDD 的缓存,如何设置缓存级别。

步骤如下:

第一步,先了解缓存级别的作用是什么,如何调用,如何获取当前的缓存级别。

第二步,介绍常见的缓存级别 最后查看缓存级别如何使用及实践。

第三步,如何取消缓存。

进入笔记,在缓存级别的章节中,第一步是如何设置缓存级别,是什么意思?

举例说明: 一个 RDD 的重要数据计算需要经过万、亿次迭代,计算成本很昂贵,所以需要保存好,不能丢失,出现错误也要动态恢复。

问题如下:

是否使用磁盘缓存?缓存在磁盘比较稳定。

是否使用内存缓存?存在内存,保持运行效率。

是否使用堆外内存?堆外内存是在Java管辖范围内之外的内存,不受 Java 控制,理论上安全度不高,由 spark 进行管理,一般情况下不使用堆外内存。

缓存前是否先序列化?是否序列化取决于数据的大小,如果数据比较大,需先使用序列化,再保存。效果较好。

是否需要有副本?一个 RDD 的分区在某个 work 上,如果 work 崩溃,那数据也将消失,所以需要分发多个 work,多个副本就可解决问题。因此解决问题需要副本。

缓存级别是 spark 预设了一组缓存级别,每一个缓存级别对应以上五个参数,一些缓存级别可能只缓存在磁盘里,一些缓存级别可能缓存在内存中,一些缓存级别可能被序列化,而有一些并不被序列化等,缓存级别就是预设参数的配合方式。

如何设置缓存级别。

步骤如下:

打开代码,可以看到,通过 persist 的方法传入 storagelevel,指定 MEMORY_ONLYdisk, 即为缓存级别,传入persist 参数即可,通过代码 aggRDD.getstoragelevel 可以看到缓存级别。

可以通过 aggRDD. getstoragelevel  可以打印出当前缓存级别,同时也能看到缓存级别,

peintln(aggRDD. getstoragelevel)可以打印,后面计算可做可不做,运行代码

image.png

可以看到 storagelevelmemorydeserialized1replicas)代表着在 memory 中是否序列化及副本数量,以上为整个级别的打印。

笔记总结 :

缓存级别使用 storagelevel 类用来定义,进入代码中,在 storagelevel 类中预设枚举,

image.png

可以发现在 storagelevel 前半部分预设一些缓存级别,每一个缓存级别都是 storage level 的一个对象,是一个伴生对象。前半部分还有一些 class storagelevel,接下来创建对象,传入参数,参数分别为_useDisk. _useMemory. _useOffHeap. deserialized. _useDisk 表示是否存储在磁盘中,_useMemory 表示是否存储在内存中,_useOffHeap表示是否使用对外内存等。在笔记中,可以看到缓存级别的具体内容、参数含义。

列表如下:

image.png

NONE 表示不使用磁盘,不使用内存,不使用堆外内存,不反序列化,即没有缓存,只有一个副本数就是自己。

DISK_ONLY 不使用磁盘,不使用内存,不使用堆外内存,不反序列化形式存储,只有一个副本。而 DISK_ONLY_2表示有2个副本。MEMORY_ONLY_SER 也使用在 memory 中,以未反序列化的形式,且存储的是反序列化后的值。

解释是否以反序列化形式存储,表示存储的数据是否已经反序列化,deserialized 是被动的,表示数据已经被反序列化过,false 表示直接存储的未反序列的对象。副本为2,表明数据会存储在两个不同的地方。

image.png

此列表示是否以反序列化形式存储,如果是,存的是对象。如果不是,则存储序列化过的值。DISK false 表明必须要序列化后,对象才能存在于磁盘中。所以反序列化都为 false。而 Memory 默认此处都为 true,此处对象都可以直接存储在内存中。

SER 参数中,将对象反序列化,将反序列化后的二进制存储在缓存中。可简单进行扩展,从图中可以看到,如果此列显示true说明存放的是对象,如果是 false,存放的是二进制数据。在 MEMORY_AND_DISK 中,反序列存储为true,说明存储的是对象,MEMORY_AND_DISK_SER 中,SER 表示会将数据进行序列化,以二进制的形式进行存储,参数都会有副本为2的配置。OFF_HEAP 在乌斯计划后加入,不需要理会。

总结:

NONE 表示不存储,DISK_ONLY, DISK_ONLY_2,表示只存储在磁盘,MEMORY_ONLY, MEMORY_ONLY_2表示存储在内存中,MEMORY_ONLY_SER, MEMORY_ONLY_SER_2表示在内存当中存储,存储二进制数,MEMORY_AND_DISK 表示内存和磁盘中同时存储。MEMORY_AND_DISK_SER 表示序列化之后进行存储二进制。

在缓存级别中有2标明有两个副本,代表有两份数据,在数据特别昂贵的前提下,可以使用带有2的存储级别。

如何选择分区级别,考验经验,图上为最佳实践步骤。在不知道如何使用的情况下,优先使用 memory_only,如果数据较大,可以使用 memory_only_ser,序列化之后进行存储,节省空间。memory_only CPU效率最高,不进行序列化和反序列化过程。memory_only_ser 需要进行序列化和反序列化,更加节省空间和多余的操作。一般情况下,不要溢出到磁盘。

Memory_and_disk 表示在 memory 中存储不下,溢出到 disk 中。一般情况下不建议使用,除非数据非常昂贵。如果需要快速故障恢复,使用副本为2的级别,一方失效,另一方可以紧急替补,不需要重新计算,否则缓存失效,需要重新进行。

在默认情况下,优先使用 memory_only,如果数据较大,需要序列化,使用 memory_only_ser,一般不使用memory_and_disk,会在内存占满时转到磁盘中,发生溢写,效率较低,除非数据较昂贵才会使用,如果数据要保证安全不被丢失,使用 memory_only_ser_2,有副本会保证安全。

相关文章
|
存储 缓存 分布式计算
187 RDD的缓存
187 RDD的缓存
42 0
|
1月前
|
存储 缓存 分布式计算
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
41 4
|
6月前
|
缓存 NoSQL 关系型数据库
数据库缓存一致性学习笔记(一)
数据库缓存一致性学习笔记(一)
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-vue-强制缓存3
前端学习笔记202306学习笔记第四十七天-vue-强制缓存3
69 0
|
6月前
|
存储 缓存 分布式计算
Spark RDD持久化与缓存:提高性能的关键
Spark RDD持久化与缓存:提高性能的关键
|
6月前
|
存储 缓存 前端开发
《Webpack5 核心原理与应用实践》学习笔记-> webpack5持久化缓存
《Webpack5 核心原理与应用实践》学习笔记-> webpack5持久化缓存
241 1
|
缓存 NoSQL 算法
Redis学习笔记-缓存容量和淘汰机制核心思想
Redis学习笔记-缓存容量和淘汰机制核心思想
141 0
|
消息中间件 缓存 NoSQL
Redis学习笔记-如何解决缓存和数据库的数据不一致
Redis学习笔记-如何解决缓存和数据库的数据不一致
187 0
|
缓存 NoSQL 数据库
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
59 0
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-vue-强制缓存2
前端学习笔记202306学习笔记第四十七天-vue-强制缓存2
81 0