三、Spark 内存管理
创始人
2024-05-29 14:49:56
0

文章目录

  • Spark 内存管理
    • 堆内和堆外内存
      • 堆内内存
      • 堆外内存
      • 堆外与堆内的平衡
    • 内存空间分配
      • 静态内存管理(早期版本)
      • 统一内存管理

Spark 内存管理

堆内和堆外内存

Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用。
堆内内存受到 JVM 统一管理,堆外内存是直接向操作系统进行内存的申请和释放。
在这里插入图片描述

堆内内存

由 Spark 应 用 程 序 启 动 时 的 – executor-memory 或spark.executor.memory 参数配置,Executor 内运行的并发任务共享 JVM 堆内内存
存储(Storage)内存:RDD 数据缓存 和广播(Broadcast)变量;
执行(Execution)内存:任务在执行 Shuffle 时占用的内存;
剩余(Other)空间:Spark 内部的对象实例,或者用户定义的 Spark 应用程序中的对象实例。

Spark 不能准确记录实际可用的堆内内存:在被 Spark 标记为释放的对象实例,有可能在实际上并没有被 JVM 回收,导致实际可用的内存小于 Spark 记录的可用内存。

堆外内存

Spark可以直接操作系统堆外内存,减少了不必要的内存开销,以及频繁的 GC 扫描和回收。堆外内存可以被精确地申请和释放(堆外内存之所以能够被精确的申请和释放,是由于内存的申请和释放不再通过JVM 机制,而是直接向操作系统申请和操作系统释放

在默认情况下堆外内存并不启用,可通过配置spark.memory.offHeap.enabled 参数启用, 并由 spark.memory.offHeap.size 参数设定堆外空间的大小。堆外内存没有 other 空间,只有Storage内存和Execution内存。

堆外与堆内的平衡

对于需要处理的数据集,如果数据模式比较扁平,而且字段多是定长数据类型,就更多地使用堆外内存。

如果数据模式很复杂嵌套结构或变长字段多,就更多采用 JVM 堆内内存会更加稳妥。

内存空间分配

静态内存管理(早期版本)

存储内存、执行内存和其他内存的大小在Spark 应用程序运行期间均为固定的,应用程序启动前可以通过参数配置。

在这里插入图片描述
堆外的空间只有存储内存和执行内存,由参数 spark.memory.storageFraction 决定

在这里插入图片描述

# 静态内存# 堆内内存
# spark.executor.memory提交任务时指定executor 堆内内存总大小
可用的Execution内存 = executor.memory * spark.shuffle.memoryFraction * spark.shuffle.safety.Fraction
可用的Storage内存 = executor.memory * spark.storage.memoryFraction * spark.storage.safety.Fraction# 堆外内存
# spark.memory.offHeap.size 提交任务时指定executor 堆外内存总大小
可用的存储内存 = memory.offHeap.size * spark.storage.memoryFraction
可用的执行内存 = memory.offHeap.size * ( 1- spark.storage.memoryFraction)

统一内存管理

与静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对方的空闲区域
在这里插入图片描述

统一内存管理的堆外内存
在这里插入图片描述

# 统一内存# 堆内内存
# spark.executor.memory提交任务时指定executor 堆内内存总大小
初始可用的Execution内存 = (executor.memory -300M) * spark.memory.fraction * (1-spark.storage.storageFraction)
初始可用的Storage内存 = (executor.memory -300M) * spark.memory.fraction * spark.storage.storageFraction# 堆外内存
# spark.memory.offHeap.size 提交任务时指定executor 堆外内存总大小
可用的存储内存 = memory.offHeap.size * spark.storage.memoryFraction
可用的执行内存 = memory.offHeap.size * ( 1- spark.storage.memoryFraction)

最重要的优化在于动态占用机制,其规则如下:

  • 如果对方的内存空间有空闲,双方可以互相抢占;

  • 对于 Storage Memory 抢占的 Execution Memory 部分,当分布式任务有计算需要时,Storage Memory 必须立即归还抢占的内存,涉及的缓存数据要么落盘、要么清除;

  • 对于 Execution Memory 抢占的 Storage Memory 部分,即便 Storage Memory 有收回内存的需要,也必须要等到分布式任务执行完毕才能释放。

相关内容

热门资讯

洛克王国不倒叮当 洛克王国不倒叮当好不容易抓个好点的。。性格是保守的。。郁闷了一般稀有宠物的天赋都很高,不到叮当,还不...
不是善茬歇后语下一句 不是善茬歇后语下一句张飞胡敬德剃了胡子——都也不是善茬张飞胡敬德剃胡子一都不是善茬都不是善茬,谁也不...
《有钱没钱回家过年》到底是谁唱... 《有钱没钱回家过年》到底是谁唱的?怎么有好多个版本?请大家帮忙找一下关于这首歌的详细介绍,最近好像流...
傲视天地 里外城的精炼该怎么弄... 傲视天地 里外城的精炼该怎么弄?楼上正解。。没啥可补充了。。。是个很靠谱的提升石头产出的东西亲爱的玩...
《安徒生童话》中有哪个故事中的... 《安徒生童话》中有哪个故事中的主人公最奇怪《安徒生童话》中,**依达**是最奇怪的角色。《小猪倌》。...
悲莫悲兮生别离,乐莫乐兮新相知... 悲莫悲兮生别离,乐莫乐兮新相知啥意思在悲伤啊莫过于活生生的别离,再快乐啊莫过于新相交的知己。
听的多音字是什么 听的多音字是什么听拼音tīng释义1.用耳朵接受声音:~力。~写。~觉。聆~。洗耳恭~。2.顺从,接...
★求最终幻想13男女主角的名字... ★求最终幻想13男女主角的名字!男主很高很帅,戴一个黑色帽子,黄头发;女主很小巧可爱,头发歪着梳的男...
泡沫之夏小说中的洛熙花心吗 泡沫之夏小说中的洛熙花心吗洛熙很专一很痴情很专一很痴情
翻身乐队免费的吗 翻身乐队免费的吗免费。翻身乐队是深圳的一个乐队,一群喜欢音乐的人相约深圳,每周在路边免费路演。
求小说 男女主高中相爱 男主车... 求小说 男女主高中相爱 男主车祸失忆 女主生了个宝宝 男主姓盛 后来男主受伤了 被女主救了求小说 男...
男生是不是都喜欢比较柔弱的女生... 男生是不是都喜欢比较柔弱的女生?柔弱的女生可以激发男生的保护欲,男生一般特别爱表现自己,特别是展现他...
相比其他作品,为什么没有人翻拍... 相比其他作品,为什么没有人翻拍金庸的《连城诀》?因为书中确实很现实,大多数人不喜欢接受现实,都是带着...
“存”繁体字怎么写? “存”繁体字怎么写?”存“字的繁体字即为简体写法”存“,读音”cún“。
三人成虎的意思 三人成虎的意思三人成虎的意思是:有三个人谎报市上有虎,听者就信以为真。比喻讹传一再重复,就可能以假充...
为什么男孩子总是欺骗女孩子? 为什么男孩子总是欺骗女孩子?不管是善意还是恶意的,难道欺骗是你们的爱好吗? 难道这样女孩子就是你的了...
活着的歌词 活着的歌词 《活着》 演唱:郝云 词曲:郝云每天站在高楼上看着地上的小蚂蚁它们的头很大它们的...
给侄女起名字 给侄女起名字大家好,我哥叫叶三杰,嫂子叫赵娟,嫂子在正月初5下午13点给偶家添一千金,想起个名。谢谢...
孔雀东南飞,到底是什么意思,有... 孔雀东南飞,到底是什么意思,有什么寓意?不能棒打鸳鸯呀《孔雀东南飞》是一个爱情故事,原文是表达两人的...
齐秦的女儿,儿子 齐秦的女儿,儿子做到不抱怨 最重要的一条 就是不要在乎 你都不放在心上!就不会在乎...