概要
Spark 内存管理概述 介绍了内存管理接口MemoryManager对内存的大致划分,这篇研究其子类StaticMemoryManager,静态内存管理器,的行为,主要是各部分内存的占比。StaticMemoryManager是Spark 1.6之前唯一的内存管理器。
StaticMemoryManager
Spark 内存管理概述 介绍了MemoryManager的UML,StaticMemoryManager继承自MemoryManager,如下
StaticMemoryManager分别使用ExecutionMemoryPool、StorageMemoryPool管理execution、storage、unroll内存,UML如下
内存管理
回顾MemoryManager
MemoryManager将内存划分为如下几部分,接下来研究静态内存管理中下面各部分占比
静态内存管理
之所以称为静态内存管理,是因为storage、execution内存占比和界限是固定的。看下代码中对storage、execution、unroll内存大小的限制
- storage
- execution
- unroll
总结如下
storage | 0.6 | storage-safety | 0.6 * 0.9 * (1.0-0.2) |
unroll | 0.6 * 0.9 * 0.2 | ||
storage-reserved | 0.6 * 0.1 | ||
execution | 0.2 | execution-safety | 0.2 * 0.8 |
execution-reserved | 0.2 * 0.2 | ||
other | 0.2 |
饼图表示如下
因为无法准确计算实际使用中的内存,因此,storage、execution都会保留一部分内存,就是上图中的storage-reserved、execution-reserved。
设置
spark 1.6版本之后默认使用统一资源管理器,由参数spark.memory.useLegacyMode控制,如下
总结
介绍StaticMemoryManager的结构,及其管理的内存storage、execution、unroll等占比,这里所说的管理只是数值的维护。
参考:
饼图工具–lizibuluo