存储级别简介

Spark中RDD提供了多种存储级别,除去使用内存,磁盘等,还有一种是OFF_HEAP,称之为 使用JVM堆外内存

https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/storage/StorageLevel.scala

使用OFF_HEAP的优点:在内存有限时,可以减少频繁GC及不必要的内存消耗(减少内存的使用),提升程序性能。

Spark内存管理根据版本划分为两个阶段:spark1.6[官网给出spark1.5之前(包含spark1.5)]之前阶段、spark1.6之后阶段。

1.6.0及以后版本,使用的统一内存管理器,由UnifiedMemoryManager实现。

  • ü  MemoryManger在spark1.6之前采用静态内存管理

(StaticMemoryManager[https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/memory/StaticMemoryManager.scala]),

  • ü  Spark1.6之后默认为统一内存管理

(UnifiedMemoryManager[https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/memory/UnifiedMemoryManager.scala])统一内存管理模块包括了堆内内存(On-heap Memory)和堆外内存(Off-heap Memory)两大区域

从1.6.0版本开始,Spark内存管理模型发生了变化。旧的内存管理模型由StaticMemoryManager类实现,现在称为“legacy(遗留)”。默认情况下,“Legacy”模式被禁用,这意味着在Spark 1.5.x和1.6.0上运行相同的代码会导致不同的行为。

为了兼容,您可以使用spark.memory.useLegacyMode参数(目前spark2.4版本中也依然保留这个静态内存管理模型)启用“旧”内存模型:

spark.memory.useLegacyMode=true(默认为false)

该参数官网给出的解释:

Whether to enable the legacy memory management mode used in Spark 1.5 and before. The legacy mode rigidly partitions the heap space into fixed-size regions, potentially leading to excessive spilling if the application was not tuned. The following deprecated memory fraction configurations are not read unless this is enabled:

spark.shuffle.memoryFraction

spark.storage.memoryFraction

spark.storage.unrollFraction

在Spark1.x以前,默认的off_heap使用的是Tachyon。但是Spark中默认操作Tachyon的TachyonBlockManager开发完成之后,代码就不再更新。当Tachyon升级为Alluxio之后移除不使用的API,导致Spark默认off_heap不可用(spark1.6+)。

错误情况可参考:https://alluxio.atlassian.net/browse/ALLUXIO-1881

Spark2.0的OFF_HEAP

从spark2.0开始,移除默认的TachyonBlockManager以及ExternalBlockManager相关的API。

移除情况可参考:https://issues.apache.org/jira/browse/SPARK-12667。

但是在Spark2.x的版本中,OFF_HEAP这一存储级别,依然存在:

https://github.com/apache/spark/blob/branch-2.4/core/src/main/java/org/apache/spark/memory/MemoryMode.java

那么,这里的OFF_HEAD 数据是如何存储的呢?

在org.apache.spark.memory中,有一个MemoryMode,MemoryMode标记了是使用ON_HEAP还是OFF_HEAP。

https://github.com/apache/spark/blob/branch-2.4/core/src/main/java/org/apache/spark/memory/MemoryMode.java

在org.apache.spark.storage.memory.MemoryStore中,根据MemoryMode类型来调用不同的存储。

https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/storage/memory/MemoryStore.scala

在MemoryStore中putIteratorAsBytes方法,是用于存储数据的方法。

其实真正管理(存储)values的对象是valuesHolder,valueHolder是SerializedValuesHolder的类对象,我们看下SerializedValuesHolder是怎么定义的。

在该方法中,OFF_HEAP使用的是org.apache.spark.unsafe.Platform(https://github.com/apache/spark/blob/master/common/unsafe/src/main/java/org/apache/spark/unsafe/Platform.java)来做底层存储的,Platform是利用java unsafe API实现的一个访问off_heap的类,所以,spark2.x的OFF_HEAP就是利用java unsafe API实现的内存管理。

Spark2.x OFF_HEAP优势:

  • ü  优点:在内存有限时,可以减少频繁GC及不必要的内存消耗(减少内存的使用,),提升程序性能。
  • ü  缺点:没有数据备份,也不能像alluxio那样保证数据高可用,丢失数据则需要重新计算。

参考

《Spark2.x 内存管理之---OFF_HEAP https://blog.csdn.net/qq_21439395/article/details/80773121

  • 关于 java  unsafe API 可参考:

《Java中Unsafe类详解 https://www.cnblogs.com/mickole/articles/3757278.html 》

《JAVA并发编程学习笔记之Unsafe类  https://blog.csdn.net/aesop_wubo/article/details/7537278》

Spark(四十六):Spark 内存管理之—OFF_HEAP的更多相关文章

  1. Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...

  2. linux基础-第十六单元 yum管理RPM包

    第十六单元 yum管理RPM包 yum的功能 本地yum配置 光盘挂载和镜像挂载 本地yum配置 网络yum配置 网络yum配置 Yum命令的使用 使用yum安装软件 使用yum删除软件 安装组件 删 ...

  3. NeHe OpenGL教程 第四十六课:全屏反走样

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. Linux操作系统基础(四)保护模式内存管理(2)【转】

    转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...

  5. 四十六、android中的Bitmap

    四十六.android中的Bitmap: http://www.cnblogs.com/linjiqin/archive/2011/12/28/2304940.html 四十七.实现调用Android ...

  6. “全栈2019”Java第四十六章:继承与字段

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. 第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么

    第四十六个知识点 在Sigma协议中,正确性,公正性和零知识性意味着什么 Sigma协议 Sigma协议是Alice想要向Bob证明一些东西的协议(Alice知道一些秘密).他们有下面的一般范式:Al ...

  8. spark 源码分析之十六 -- Spark内存存储剖析

    上篇spark 源码分析之十五 -- Spark内存管理剖析 讲解了Spark的内存管理机制,主要是MemoryManager的内容.跟Spark的内存管理机制最密切相关的就是内存存储,本篇文章主要介 ...

  9. Spark 1.6以后的内存管理机制

     Spark 内部管理机制 Spark的内存管理自从1.6开始改变.老的内存管理实现自自staticMemoryManager类,然而现在它被称之为"legacy". " ...

随机推荐

  1. Python学习日记(十) 生成器和迭代器

    使用dir()我们可以知道这个数据类型的内置函数有什么方法: print(dir(int)) print(dir(bool)) print(dir([])) print(dir({})) print( ...

  2. (备忘)cron表达式的用法

    一.结构 cron表达式用于配置cronTrigger的实例,实现任务调度的功能. Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格 ...

  3. Linux命令——tree

    参考:Linux tree Command Tutorial for Beginners (6 Examples) 简介 Linux tree命令用于以树状图列出目录的内容. 执行tree指令,它会列 ...

  4. CV2识别图片A,B,C,D

    这个模型是经过简单训练,只能识别四个英文字母:ABCD,是我为了提取答案才训练的,因为科大,百度,以及腾讯的识别不是很准,所以自己训练自己使用,希望能够给你带来方便.下面是训练好的model,如多你感 ...

  5. JSON空值处理与 StringUtils工具类使用

    JSON 动态查询时,需要的条件本应是null,前端传入的是" " //null转换为"" private static ValueFilter filter ...

  6. Problem E: 数量的类模板

    #include<iostream> #include<iomanip> #include<algorithm> using namespace std; temp ...

  7. SpringBoot RabbitMQ 延迟队列代码实现

    场景 用户下单后,如果30min未支付,则删除该订单,这时候就要可以用延迟队列 准备 利用rabbitmq_delayed_message_exchange插件: 首先下载该插件:https://ww ...

  8. 手写热更新阐述tinker实现原理

    关于热更新如今面试也是基本上都会提及到的,我上一家公司用的是tinker,而这里准备研究的也是它的原理,而关于tinker的原理网上也是一大堆文章进行介绍,为了对它有个更加进一步的认识,所以自己动手来 ...

  9. go cache

    go 编译, 或是安装库的时候,产生的日志量很大 go env 删除掉这个log.txt文件,系统空间瞬间就够了

  10. test20190729 夏令营NOIP训练14

    40+100+0=140. 基因光线 黑大帅统治古古怪界后,一直在玩一种很奇葩的游戏.在一个二维平面上,他先复制了n个小A,把他们放在不同的位置,然后射出一条ax+by+c=0的基因光线,宽度为d,即 ...