Spark内存管理机制
请解释Spark的内存管理机制,包括堆内内存(On-Heap)和堆外内存(Off-Heap)的划分,以及Spark 1.6引入的统一内存管理(Unified Memory Management)。
回答
苦行僧
Spark内存管理模型(Unified Memory Management,Spark 1.6+):
堆内内存(On-Heap)划分(默认300MB起):
1. 存储内存(Storage Memory): spark.memory.storageFraction(默认0.5)
- 用于缓存RDD、Broadcast变量
- 可被执行内存借用
2. 执行内存(Execution Memory): 1 - spark.memory.storageFraction(默认0.5)
- 用于Shuffle、Join、Sort、Aggregate等计算
- 可被存储内存借用
3. 预留内存(Reserved Memory): 固定300MB
- 用于JVM内部对象和Spark内部元数据
4. 用户内存(User Memory): (JVM Heap - Reserved) × (1 - spark.memory.fraction)
- 用于用户代码中构建的对象(如RDD的flatMap中创建的对象)
统一内存管理核心特性:
- 弹性借用: 存储内存不够时可借用执行内存,反之亦然
- 借还机制: 当对方需要时,借用方必须归还(通过缓存淘汰或Spill到磁盘)
- 优化目标: 提高内存利用率,避免某类内存空闲而另一类不足
堆外内存(Off-Heap):
- 由Tungsten管理,通过
spark.memory.offHeap.enabled=true启用 - 优点:不受GC影响,适合大内存场景
- 默认大小:
spark.memory.offHeap.size(默认0,需手动配置)
关键参数: | 参数 | 默认值 | 说明 | |------|--------|------| | spark.memory.fraction | 0.6 | 统一内存占总堆比例 | | spark.memory.storageFraction | 0.5 | 存储内存占统一内存比例 | | spark.shuffle.memoryFraction | 0.2 | Shuffle内存占比(旧模式) | | spark.storage.memoryFraction | 0.6 | 缓存内存占比(旧模式) |