Spark on Yarn 为啥出现内存超界container被kill

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark on Yarn 为啥出现内存超界container被kill相关的知识,希望对你有一定的参考价值。

参考技术A 一个Executor对应一个JVM进程。 从Spark的角度看,Executor占用的内存分为两部分: ExecutorMemory 和 MemoryOverhead 。其中, ExecutorMemory 为JVM进程的Java堆区域, MemoryOverhead 为JVM进程中除Java堆以外占用的空间大小,包括方法区(永久代)、Java虚拟机栈、本地方法栈、JVM进程本身所用的内存、堆外内存(Direct Memory)等。

spark.driver.memory 和 spark.executor.memory 分别设置Spark的Driver和Executor的 ExecutorMemory .

spark.yarn.executor.memoryOverhead 和 spark.yarn.driver.memoryOverhead 分别设置Spark的Driver和Executor的 MemoryOverhead .

另外,Spark会大量分配堆外内存,堆外内存默认最大可以和 ExecutorMemory 一样,可以通过javaOptions使用 MaxDirectMemorySize 配置最大值。

堆外内存最大可以和 ExecutorMemory 一样,但是堆外内存又受 MemoryOverhead 限制,所以当 MaxDirectMemorySize , ExecutorMemory 和 MemoryOverhead 设置不合理时,会出现container内存超限,被Yarn kill的情况。

比如, ExecutorMemory 为8G, MemoryOverhead 为4G, MaxDirectMemorySize 没有设置,此时yarn认为一个container最大可以使用12G内存,但是堆外内存最大可以使用8G,导致container最大可以使用超过16G内存(堆内内存+ 堆外内存),比12G大, 最终被Yarn kill掉。

合理的设置规则为: ExecutorMemory + MemoryOverhead > ExecutorMemory + MaxDirectMemorySize

所以,Spark应用占用集群内存的总大小为:

参数调优建议:

每个Executor进程的内存设置4G~8G较为合适。

每个Executor的CPU core数量设置为2~4个较为合适。

以下是部分建议的参数设置:

Spark On YARN内存和CPU分配

本篇博客参考:http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/ 

软件版本:

CDH:5.7.2,JDK:1.7;

问题描述:

在使用Spark On YARN时(无论是Client模式或者是Cluster模式,当然下面会有这种模式的对比区别),可以添加诸如:

以上是关于Spark on Yarn 为啥出现内存超界container被kill的主要内容,如果未能解决你的问题,请参考以下文章

Spark On YARN内存分配

配置Spark on YARN集群内存

在 Spark-on-Yarn 中配置 Executor 和 Driver 内存

配置Spark on YARN集群内存

spark on yarn的技术挑战

Spark On YARN内存和CPU分配