进入大数据领域后,零碎的接触很多东西,很多都是当时很清楚,过了一段时间就忘记了,所以整理一篇博客记录下:
先上一个看到比较好的博客,有时间在把自己的总结写下来:https://www.cnblogs.com/dreamfly2016/p/5720180.html
一.Spark 的内存划分,以spark 1.6 为例:
假设一个excutor 设置内存为10G:
1.安全空间(safe)为:10G*0.10=1G,也就是说安全空间占比10%,此部分空间是为了避免内存溢出设置的安全措施,设置参数
为:spark.storage.safetyFraction
2.缓存空间(Storage):10G*0.9*0.6=5.4G,缓存空间就是总内存减去安全空间后,剩余空间的百分之六十。设置
为: spark.executor.memory x spark.storage.safetyFraction x spark.storage.memoryFraction,storage空间就是spark加载缓存数据的地方,所以他的大小就决定了你能缓存到内存处理多少数据
3.反序列化空间(Unroll):5.4G*0.2=1.08G ,Unroll 空间就是Storage空间的百分之二十,专门用来缓存序列化数据,进行反序列化,该
操作优先级较高,可能会挤出其它缓存。设置参数为spark.storage.unrollFraction
4.shuffer空间:10G*0.2*0.8=16G,当进行shuffer时会在该空间进行,shuffer空间为总空间的20%,后面乘以的0.8是因为shuffer空
间也有一个默认的安全空间,占比为shuffer空间的20%,所以shuffer内存大小20G,我们可存储数据的就只有16G。
二:Spark 2.X JVM使用原理:
下图是一种叫联合内存 (Spark Unified Memeory),数据缓存与数据执行之间的内存可以相互移动,这是一种更弹性的方式,下图显示的是 Spark 2.x 版本对 Java 堆 (heap) 的使用情况,数据处理以及类的实体对象存放在 JVM 堆 (heap) 中。
1.Spark 2.1.0 新型 JVM Heap 分成三个部份:Reserved Memory、User Memory 和 Spark Memory。
具体的内存分配状况可参考该博客:https://blog.csdn.net/qq_37303226/article/details/80774387222
2.针对一些JVM的一些参数设置:
之前看spark 设置里有人用xms、xmx这些参数设置内存大小,一直没搞清楚这些内存在设置什么,跟submit提交时设置的excutor内存有啥区别,现在搞清楚了,spark 1.5及之前,spark使用内存就是JVM内存,所以可以直接用JVM的参数设置内存大小,现在基本不用了,不过下面还是罗列下JVM内存的设置方法
通用法则1:
将java堆的初始值-Xms和最大值-Xmx设置为老年代活跃数据大小的3~4倍
所以此处就设置 -Xms1600m,-Xmx1600m
在以上的测试结果中可以看到原始的堆大小为1675m左右,是比较接近的。
通用法则2:
永久带的初始值-XX:PermSize及最大值-XX:MaxPermSize应该比永久代活跃数据大1.2~1.5倍
所以此处就设置-XX:PermSize=13m,-XX:MaxPermSize=13m
补充法则:
新生代空间应该为老年代空间活跃数据的1~1.5倍
此处老年代为400m,新生代就为600m
如果java堆的初始值及最大值为活跃数据的3~4倍,新生代为活跃数据的1~1.5倍时,老年代应设置为活跃数据大小的2~3倍
另附一些优秀的spark 内存优化连接:
https://blog.csdn.net/bitcarmanlee/article/details/78789679