Hadoop 纱线-为什么';t任务超出堆空间,但容器被杀死?

Hadoop 纱线-为什么';t任务超出堆空间,但容器被杀死?,hadoop,yarn,hadoop2,Hadoop,Yarn,Hadoop2,如果纱线容器超出其堆大小设置,则映射或减少任务将失败,错误类似于以下错误: 2015-02-06 11:58:15,461 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Container [pid=10305,containerID=container_1423215865404_0002_01_000007] is running beyond ph

如果纱线容器超出其堆大小设置,则映射或减少任务将失败,错误类似于以下错误:

2015-02-06 11:58:15,461 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Container [pid=10305,containerID=container_1423215865404_0002_01_000007] is running beyond physical memory limits. 
Current usage: 42.1 GB of 42 GB physical memory used; 42.9 GB of 168 GB virtual memory used. Killing container.
Dump of the process-tree for container_1423215865404_0002_01_000007 :
        |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
        |- 10310 10305 10305 10305 (java) 1265097 48324 46100516864 11028122 /usr/java/default/bin/java -server -XX:OnOutOfMemoryError=kill %p -Xms40960m -Xmx40960m -XX:MaxPermSize=128m -Dspark.sql.shuffle.partitions=20 -Djava.io.tmpdir=/data/yarn/datanode/nm-local-dir/usercache/admin/appcache/application_1423215865404_0002/container_1423215865404_0002_01_000007/tmp org.apache.spark.executor.CoarseGrainedExecutorBackend akka.tcp://sparkDriver@marx-61:56138/user/CoarseGrainedScheduler 6 marx-62 5
        |- 10305 28687 10305 10305 (bash) 0 0 9428992 318 /bin/bash -c /usr/java/default/bin/java -server -XX:OnOutOfMemoryError='kill %p' -Xms40960m -Xmx40960m  -XX:MaxPermSize=128m -Dspark.sql.shuffle.partitions=20 -Djava.io.tmpdir=/data/yarn/datanode/nm-local-dir/usercache/admin/appcache/application_1423215865404_0002/container_1423215865404_0002_01_000007/tmp org.apache.spark.executor.CoarseGrainedExecutorBackend akka.tcp://sparkDriver@marx-61:56138/user/CoarseGrainedScheduler 6 marx-62 5 1> /opt/hadoop/logs/userlogs/application_1423215865404_0002/container_1423215865404_0002_01_000007/stdout 2> /opt/hadoop/logs/userlogs/application_1423215865404_0002/container_1423215865404_0002_01_000007/stderr

有趣的是,所有阶段都完成了,就在调用“另存为序列文件”时,它失败了。执行器没有用完堆空间,不知道还有什么在消耗它?

Spark执行器一直被杀死,Spark不断重试失败的阶段。对于Spark on Thread,如果Spark executor使用的内存超过“Spark.executor.memory”+“Spark.Thread.executor.memoryOverhead”的配置大小,则节点管理器将杀死Spark executor。增加“spark.Thread.executor.memoryOverhead”以确保它覆盖了executor堆外内存的使用

一些问题:


在这种情况下,实际运行容器的物理内存不足:

当前使用情况:使用42 GB物理内存中的42.1 GB


虚拟内存不是边界因素。您必须增加容器的堆大小或增加spark.Thread.executor.memoryOverhead,以便在不必增加执行器堆大小的情况下为纱线容器提供更多空间。

我遇到了与OP完全相同的问题,所有阶段都成功了,并且只有在保存和写入结果时,容器将被杀死

如果超过java堆内存,您会看到OutOfMemory异常,但被终止的容器与除java堆内存之外的所有内容相关,java堆内存可以与memoryOverhead或应用程序主内存相关

在我的例子中,增加
spark.Thread.executor.memoryOverhead
spark.Thread.driver.memoryOverhead
没有帮助,因为可能是我的应用程序主程序(AM)内存不足。在
纱线客户端
模式下,增加AM内存的配置为
spark.warn.AM.memory
。对于
纱线簇
模式,它是驾驶员存储器。这就是我的工作方式

以下是我得到的错误的参考:

Application application_1471843888557_0604 failed 2 times due to AM Container for appattempt_1471843888557_0604_000002 exited with exitCode: -104
For more detailed output, check application tracking page:http://master01.prod2.everstring.com:8088/cluster/app/application_1471843888557_0604Then, click on links to logs of each attempt.
Diagnostics: Container [pid=89920,containerID=container_e59_1471843888557_0604_02_000001] is running beyond physical memory limits. 
Current usage: 14.0 GB of 14 GB physical memory used; 16.0 GB of 29.4 GB virtual memory used. Killing container.

这是哪个容器?这是一个很好的分析。但是,如果您看到OP的容器正在耗尽物理内存而不是虚拟内存。因此,如果他只是在Thread-site.xml中禁用“Thread.nodemanager.pmem check enabled”,那么nodemanager应该保留容器,直到达到168GB的虚拟内存。我也有同样的问题,我试过了,但没有成功。spark作业不遵守虚拟内存限制。什么是“memoryOverhead”?我在doc中看到“每个执行器要分配的堆外内存量(以MB为单位)。这是一种内存,用于计算VM开销、内部字符串、其他本机开销等。这会随着执行器的大小(通常为6-10%)而增长。”但为什么字符串和虚拟机开销在某些情况下会超过10%,就像我的一样,因为我的执行器内存仍然占10%。