spark内存模型概论

背景:
自从开始接触spark之后就一直很奇怪spark on yarn到底是怎么样跑起来了,具体的内存占用是怎么分配的?如果container的内存小于–executor-memory的话,spark程序能够跑起来吗?记得在某次的面试中还问过别人这个欠揍的问题,?。另外最近程序也老是莫名其妙的被kill掉了,要么就是exit 137等。

组件:
基于spark2.2.x

正文:

spark on yarn内存模型
spark内存模型概论
此处的off-heap特指spark使用堆外内存,配置参数如:spark.memory.offHeap.*

下面我们着重说一下spark memory,自从spark1.6之后spark默认使用UnifiedMemoryManager作为spark默认的内存管理者。所以此处会基于UnifiedMemoryManager来说明一下spark有趣的内存管理方式
spark内存模型概论

我们把图一中spark memory的内存放大之后来看
spark内存模型概论

然后把executor memory放大来看
spark内存模型概论

一个特别有意思的地方就是storage memory与execution memory会相互借内存
最后特别感兴趣的小伙伴们,可以去查看一下UnifiedMemoryManager的源码。对了回答一下开头的欠揍的问题,当container的内存小于Executor memory时spark程序会跑起来吗?这个得具体分析,spark on yarn有一个参数默认是达到executor memory *0.8, spark程序即可以跑起来