Spark 内存模型

总结一下 Spark 的内存管理模型。

静态内存管理

在 Spark 最初采用的静态内存管理机制下,存储内存、执行内存和其他内存的大小在 Spark 应用程序运行期间均为固定的。

img

堆外的空间分配较为简单,只有存储内存和执行内存。可用的执行内存和存储内存占用的空间大小直接由参数 spark.memory.storageFraction 决定,由于堆外内存占用的空间可以被精确计算,所以无需再设定保险区域。

img

动态内存管理

Spark 1.6 之后引入的统一内存管理机制,与静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对方的空闲区域。

img

如下图所示,首先根据 spark.storage.storageFraction 确定了双方各自拥有的空间的范围。双方的空间都不足时,则存储到硬盘,若一方空间不足而对方空余时,可借用对方的空间。执行内存的空间被对方占用后,可让对方将占用的部分转存到硬盘,然后归还借用的空间。存储内存的空间被对方占用后,无法让对方归还,因为需要考虑 Shuffle 过程中的很多因素,实现起来较为复杂。

img