RDD的持久化机制

弹性分布式数据集(RDD)作为 Spark 最根本的数据抽象,是只读的分区记录(Partition)的集合,只能基于在稳定物理存储中的数据集上创建,或者在其他已有的 RDD 上执行转换(Transformation)操作产生一个新的 RDD。转换后的 RDD 与原始的 RDD 之间产生的依赖关系,构成了血统(Lineage)。凭借血统,Spark 保证了每一个 RDD 都可以被重新恢复。但 RDD 的所有转换都是惰性的,即只有当一个返回结果给 Driver 的行动(Action)发生时,Spark 才会创建任务读取 RDD,然后真正触发转换的执行。

Task 在启动之初读取一个分区时,会先判断这个分区是否已经被持久化,如果没有则需要检查 Checkpoint 或按照血统重新计算。所以如果一个 RDD 上要执行多次行动,可以在第一次行动中使用 persist 或 cache 方法,在内存或磁盘中持久化或缓存这个 RDD,从而在后面的行动时提升计算速度。

事实上,cache 方法是使用默认的 MEMORY_ONLY 的存储级别将 RDD 持久化到内存,故缓存是一种特殊的持久化。 堆内和堆外存储内存的设计,便可以对缓存 RDD 时使用的内存做统一的规划和管理

RDD 的持久化由 Spark 的 Storage 模块负责,实现了 RDD 与物理存储的解耦合。Storage 模块负责管理 Spark 在计算过程中产生的数据,将那些在内存或磁盘、在本地或远程存取数据的功能封装了起来。在具体实现时 Driver 端和 Executor 端的 Storage 模块构成了主从式的架构,即 Driver 端的 BlockManager 为 Master,Executor 端的 BlockManager 为 Slave。

Storage 模块在逻辑上以 Block 为基本存储单位,RDD 的每个 Partition 经过处理后唯一对应一个 Block(BlockId 的格式为 rdd_RDD-ID_PARTITION-ID )。Driver端的Master 负责整个 Spark 应用程序的 Block 的元数据信息的管理和维护,而Executor端的 Slave 需要将 Block 的更新等状态上报到 Master,同时接收 Master 的命令,例如新增或删除一个 RDD。

图6-7 Storage模块示意图

在对 RDD 持久化时,Spark 规定了 MEMORY_ONLY、MEMORY_AND_DISK 等 7 种不同的存储级别 ,而存储级别是以下 5 个变量的组合:

代码清单6-2 resourceOffer代码

class StorageLevel private(

private var _useDisk: Boolean, //磁盘

private var _useMemory: Boolean, //这里其实是指堆内内存

private var _useOffHeap: Boolean, //堆外内存

private var _deserialized: Boolean, //是否为非序列化

private var _replication: Int = 1 //副本个数

)

Spark中7种存储级别如下:

表6-1 Spark持久化级别

持久化级别

含义

MEMORY_ONLY

以非序列化的Java对象的方式持久化在JVM内存中。如果内存无法完全存储RDD所有的partition,那么那些没有持久化的partition就会在下一次需要使用它们的时候,重新被计算

MEMORY_AND_DISK

同上,但是当某些partition无法存储在内存中时,会持久化到磁盘中。下次需要使用这些partition时,需要从磁盘上读取

MEMORY_ONLY_SER

同MEMORY_ONLY,但是会使用Java序列化方式,将Java对象序列化后进行持久化。可以减少内存开销,但是需要进行反序列化,因此会加大CPU开销

MEMORY_AND_DISK_SER

同MEMORY_AND_DISK,但是使用序列化方式持久化Java对象

DISK_ONLY

使用非序列化Java对象的方式持久化,完全存储到磁盘上

MEMORY_ONLY_2

MEMORY_AND_DISK_2

等等

如果是尾部加了2的持久化级别,表示将持久化数据复用一份,保存到其他节点,从而在数据丢失时,不需要再次计算,只需要使用备份数据即可

通过对数据结构的分析,可以看出存储级别从三个维度定义了 RDD 的 Partition(同时也就是 Block)的存储方式:

  • 存储位置:磁盘/堆内内存/堆外内存。如 MEMORY_AND_DISK 是同时在磁盘和堆内内存上存储,实现了冗余备份。OFF_HEAP 则是只在堆外内存存储,目前选择堆外内存时不能同时存储到其他位置。
  • 存储形式:Block 缓存到存储内存后,是否为非序列化的形式。如 MEMORY_ONLY 是非序列化方式存储,OFF_HEAP 是序列化方式存储。
  • 副本数量:大于 1 时需要远程冗余备份到其他节点。如 DISK_ONLY_2 需要远程备份 1 个副本。

2、RDD的缓存过程

RDD 在缓存到存储内存之前,Partition 中的数据一般以迭代器(Iterator)的数据结构来访问,这是 Scala 语言中一种遍历数据集合的方法。通过 Iterator 可以获取分区中每一条序列化或者非序列化的数据项(Record),这些 Record 的对象实例在逻辑上占用了 JVM 堆内内存的 other 部分的空间,同一 Partition 的不同 Record 的存储空间并不连续

RDD 在缓存到存储内存之后,Partition 被转换成 Block,Record 在堆内或堆外存储内存中占用一块连续的空间。Partition由不连续的存储空间转换为连续存储空间的过程,Spark称之为”展开”(Unroll

Block 有序列化和非序列化两种存储格式,具体以哪种方式取决于该 RDD 的存储级别。非序列化的 Block 以一种 DeserializedMemoryEntry 的数据结构定义,用一个数组存储所有的对象实例,序列化的 Block 则以 SerializedMemoryEntry的数据结构定义,用字节缓冲区(ByteBuffer)来存储二进制数据。每个 Executor 的 Storage 模块用一个链式 Map 结构(LinkedHashMap)来管理堆内和堆外存储内存中所有的 Block 对象的实例,对这个 LinkedHashMap 新增和删除间接记录了内存的申请和释放。

因为不能保证存储空间可以一次容纳 Iterator 中的所有数据,当前的计算任务在 Unroll 时要向 MemoryManager 申请足够的 Unroll 空间来临时占位,空间不足则 Unroll 失败,空间足够时可以继续进行

对于序列化的 Partition,其所需的 Unroll 空间可以直接累加计算,一次申请。

对于非序列化的 Partition 则要在遍历 Record 的过程中依次申请,即每读取一条 Record,采样估算其所需的 Unroll 空间并进行申请,空间不足时可以中断,释放已占用的 Unroll 空间。

如果最终 Unroll 成功,当前 Partition 所占用的 Unroll 空间被转换为正常的缓存 RDD 的存储空间,如下图所示。

图6-8 Spark Unroll

在静态内存管理时,Spark 在存储内存中专门划分了一块 Unroll 空间,其大小是固定的,统一内存管理时则没有对 Unroll 空间进行特别区分,当存储空间不足时会根据动态占用机制进行处理。

3、淘汰与落盘

由于同一个 Executor 的所有的计算任务共享有限的存储内存空间,当有新的 Block 需要缓存但是剩余空间不足且无法动态占用时,就要对 LinkedHashMap 中的旧 Block 进行淘汰(Eviction),而被淘汰的 Block 如果其存储级别中同时包含存储到磁盘的要求,则要对其进行落盘(Drop),否则直接删除该 Block

存储内存的淘汰规则为:

  • 被淘汰的旧 Block 要与新 Block 的 MemoryMode 相同,即同属于堆外或堆内内存;
  • 新旧 Block 不能属于同一个 RDD,避免循环淘汰;
  • 旧 Block 所属 RDD 不能处于被读状态,避免引发一致性问题;
  • 遍历 LinkedHashMap 中 Block,按照最近最少使用(LRU)的顺序淘汰,直到满足新 Block 所需的空间。其中 LRU 是 LinkedHashMap 的特性。

落盘的流程则比较简单,如果其存储级别符合_useDisk 为 true 的条件,再根据其_deserialized 判断是否是非序列化的形式,若是则对其进行序列化,最后将数据存储到磁盘,在 Storage 模块中更新其信息。

Spark 内存管理存储内存管理_尚硅谷大数据培训相关推荐

  1. Tableau工具使用简介-尚硅谷大数据培训

    Tableau概述 作为领先的数据可视化工具,Tableau具有许多理想的和独特的功能.其强大的数据发现和探索应用程序允许您在几秒钟内回答重要的问题.您可以使用Tableau的拖放界面可视化任何数据, ...

  2. ElasticSearch环境配置-尚硅谷大数据培训

    ElasticSearch(单节点)环境配置 // 通过Wget下载ElasticSearch安装包 [bigdata@linux ~]$wget https://artifacts.elastic. ...

  3. Azkaban环境配置-尚硅谷大数据培训

    Azkaban(单节点)环境配置 1 安装Git // 安装GIT [bigdata@linux ~]$ sudo yum install git // 通过git下载Azkaban源代码 [bigd ...

  4. Hadoop源码编译介绍-尚硅谷大数据培训

    前期准备工作 1.CentOS联网 使用能连接外网的CentOS系统虚拟机,使用root用户进行编译,避免出现文件夹权限问题. 2.Jar包准备 从官网下载以下安装包 (1)hadoop-3.1.3- ...

  5. SQL语法应用介绍-尚硅谷大数据培训

    1 CREATE 1.1 CREATE DATABASE 用于创建指定名称的数据库,语法如下: CREATE DATABASE [IF NOT EXISTS] db_name 如果查询中存在IF NO ...

  6. 电商数据源分析-尚硅谷大数据培训

    数据源分析 1 user_visit_action user_visit_action 表:存放网站或者APP 每天的点击流数据.通俗地讲,就是用户对网站/APP 每点击一下,就会产生一条存放在这个表 ...

  7. 电商数仓描述_笔记-尚硅谷大数据项目数据仓库-电商数仓V1.2新版

    架构 项目框架 数仓架构 存储压缩 Snappy与LZO LZO安装: 读取LZO文件时,需要先创建索引,才可以进行切片. 框架版本选型Apache:运维麻烦,需要自己调研兼容性. CDH:国内使用最 ...

  8. 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】

    视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...

  9. 尚硅谷大数据技术Spark教程-笔记09【SparkStreaming(概念、入门、DStream入门、案例实操、总结)】

    尚硅谷大数据技术-教程-学习路线-笔记汇总表[课程资料下载] 视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[SparkCore ...

最新文章

  1. java new string 图_Java中String直接赋字符串和new String的一些问题
  2. Linux运维人员-服务器组成硬件基础
  3. 使用Python和Asyncio编写在线多人游戏(二)
  4. SparkSQL使用之Thrift JDBC server
  5. eyoucms的添加内容发布
  6. 产品经理,你们做产品最孤独的时刻是什么?
  7. sql获取oracle数据库数据,通过sql语句获取数据库的基本信息
  8. IOS 通讯录 右侧的字母栏
  9. 如何使用你手中的利器
  10. 动手造轮子:实现一个简单的依赖注入(二) --- 服务注册优化
  11. plsql如何显示表结构图_【论文攻略】排版技巧——如何用 Word 编辑参考文献
  12. linux查看帮助文档的命令,Linux如何使用查看一个命令的帮助文档呢?
  13. Exchange的AutoDiscover服务
  14. 苹果召回部分产品;罗永浩锤子商城并入字节跳动;美团打车上线上海南京 | 极客头条...
  15. Python 批量下载BiliBili视频 打包成软件
  16. win7 iis php mysql_windows7和iis配置的php phpinfo()中没有mysql组件
  17. BNF之讲解 ABNF之规范 (RFC 5234)
  18. NR PRACH(五) type1 RA(4-step)基本过程
  19. Node中间件和路由器
  20. 安德玛交互式体验旗舰店杭州开业;因美纳新一代基因测序仪在华上市;苏伊士集团扩大在华业务布局 | 美通企业周刊...

热门文章

  1. jquery的回调对象Callbacks详解
  2. 基于51单片机的智能火灾报警系统
  3. 2022年河南省房地产经纪人(房地产交易制度政策)练习题及答案
  4. 物理层一致性(Compliance)测试
  5. Linux触摸屏动效
  6. 日本厚生劳动省核准Invivoscribe的LeukoStrat CDx FLT3突变检测作为第一三共的Quizartinib治疗复发/难治FLT3-ITD AML的伴侣诊断试剂。扩展用途包括EDT
  7. 职教云自动选题、答题并自动修改答题已用时间 脚本
  8. Project 2013项目管理教程(2):project基础操作概述
  9. 【论文笔记】FC-EF,FC-Siam-conc,FC-Siam-diff:用于变化检测的全卷积孪生神经网络
  10. Python_Task05:字典、集合和序列