Spark内存管理机制详解
请详细介绍Spark的内存模型,包括堆内内存(On-Heap)和堆外内存(Off-Heap)的划分,各区域的作用及配置参数。
回答
我还是少年
Spark内存分为堆内和堆外两大部分:
一、堆内内存(On-Heap):
- 执行内存(Execution Memory):Shuffle、Join、Sort、Aggregation等计算使用,
spark.executor.memory×spark.memory.fraction×spark.memory.storageFraction - 存储内存(Storage Memory):缓存RDD/Broadcast变量/累加器
- 用户内存(User Memory):用户代码和UDF中的对象,
spark.executor.memory×(1-spark.memory.fraction) - 预留内存(Reserved Memory):固定300MB
二、统一内存管理(Unified Memory,Spark 1.6+):
- 执行内存和存储内存可以互相抢占(动态占用)
- 存储内存空闲时执行内存可借用,反之亦然
- 但执行内存被借走时,存储内存必须强制逐出(Evict)归还
三、堆外内存(Off-Heap):
spark.memory.offHeap.enabled=truespark.memory.offHeap.size指定大小- 优点:减少GC压力、可序列化数据直接操作
- 缺点:必须手动管理内存,序列化/反序列化有开销
关键参数:
spark.memory.fraction=0.6:执行+存储占总堆的比例spark.memory.storageFraction=0.5:存储占执行+存储区域的比例(初始边界)- 计算:执行内存=(0.6×0.5)×堆=0.3堆,存储也一样
Spark 3.0+ 引入spark.sql.adaptive.localShuffleReader.enabled进一步优化内存