spark堆外内存的设置

MemoryOverheadJVM进程中除Java以外占用的空间大小,包括方法区(永久代)、Java虚拟机栈、本地方法栈、JVM进程本身所用的内存、直接内存(Direct Memory等。通过spark.yarn.executor.memoryOverhead设置,单位MB

相关源码:

[java]  view plain  copy
  1. //yarn/common/src/main/scala/org/apache/spark/deploy/yarn/YarnSparkHadoopUtil.scala  
  2.   val MEMORY_OVERHEAD_FACTOR = 0.07  
  3.   val MEMORY_OVERHEAD_MIN = 384  
  4.   
  5. //yarn/common/src/main/scala/org/apache/spark/deploy/yarn/YarnAllocator.scala  
  6.   protected val memoryOverhead: Int = sparkConf.getInt("spark.yarn.executor.memoryOverhead",  
  7.     math.max((MEMORY_OVERHEAD_FACTOR * executorMemory).toInt, MEMORY_OVERHEAD_MIN))  
  8. ......  
  9.       val totalExecutorMemory = executorMemory + memoryOverhead  
  10.       numPendingAllocate.addAndGet(missing)  
  11.       logInfo(s"Will allocate $missing executor containers, each with $totalExecutorMemory MB " +  
  12.         s"memory including $memoryOverhead MB overhead")  


 

三、相关问题

如果用于存储RDD的空间不足,先存储的RDD的分区会被后存储的覆盖。当需要使用丢失分区的数据时,丢失的数据会被重新计算

如果Java或者永久代的内存不足,则会产生各种OOM异常,executor会被结束。spark会重新申请一个container运行executor。失败executor上的任务和存储的数据会在其他executor上重新计算。

如果实际运行过程中ExecutorMemory+MemoryOverhead之和(JVM进程总内存)超过container的容量。YARN会直接杀死containerexecutor日志中不会有异常记录。spark同样会重新申请container运行executor


Java以外的JVM进程内存占用较多的情况下,应该将MemoryOverhead设置为一个足够大的值,应该将MemoryOverhead设置为一个足够大的值,以防JVM进程因实际占用的内存超标而被kill。如果默认值math.max((MEMORY_OVERHEAD_FACTOR *executorMemory).toInt,MEMORY_OVERHEAD_MIN不够大,可以通过spark.yarn.executor.memoryOverhead手动设置一个更大的值。

你可能感兴趣的:(spark)