Spark 3.0 YARN模式下堆外内存的JVM控制及参数传递疑问
关于Spark 3.0 YARN模式下堆外内存配置的问题解答
核心结论
- 不需要手动告知YARN容器预留2G堆外内存:Spark会自动将
spark.memory.offHeap.size的大小纳入向YARN申请的容器总内存中,YARN会根据计算后的总内存值为容器分配资源。 - Spark确实不会传递
-XX:MaxDirectMemorySize这类JVM参数:这是因为Spark的堆外内存管理逻辑是独立实现的,并非依赖JVM的直接内存机制。
详细解释
YARN容器内存计算逻辑:
在YARN模式下,Spark向YARN申请的Executor容器总内存 =spark.executor.memory+spark.memory.offHeap.size+spark.executor.memoryOverhead(Driver端逻辑同理)。也就是说,你配置的2G堆外内存已经被Spark自动加到了容器总内存请求里,YARN会为容器预留足够的空间,无需额外手动声明。Spark堆外内存的实现方式:
Spark的堆外内存使用sun.misc.UnsafeAPI直接分配内存块,完全由Spark自身的内存管理模块管控,依赖spark.memory.offHeap.size参数来限制最大可用堆外内存,不需要通过JVM的-XX:MaxDirectMemorySize参数来控制。因此你在源码中找不到这类JVM参数的传递逻辑是正常的,这是Spark内存模型的设计决定的。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

