纱线 - 为什么任务没有超出堆空间但是容器被杀死了?

时间:2015-02-09 07:24:10

标签: hadoop yarn hadoop2

如果YARN容器超出其堆大小设置,则map或reduce任务将失败,错误类似于下面的错误:

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

值得注意的是,所有阶段都已完成,只要在调用保存为序列文件时,它就会失败。执行者没有耗尽堆空间,想知道还有什么东西在吃它?

3 个答案:

答案 0 :(得分:3)

Spark执行器一直被杀死,Spark一直在重试失败的阶段。对于YARN上的Spark,如果节点管理器使用的内存大于" spark.executor.memory"的配置大小,则nodemanager会终止Spark执行器。 +" spark.yarn.executor.memoryOverhead"。增加" spark.yarn.executor.memoryOverhead"确保它涵盖执行程序的堆外内存使用情况。

一些问题:

答案 1 :(得分:2)

在这种情况下,您实际上是在物理内存中运行容器:

当前用法:使用42.1 GB的42 GB物理内存

虚拟内存不是边界因素。您必须增加容器的堆大小或增加spark.yarn.executor.memoryOverhead以为YARN容器提供更多空间,而不必增加执行程序堆大小。

答案 2 :(得分:0)

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

如果超出了Java堆内存,则会看到 OutOfMemory 异常,但被杀死的容器与除Java堆内存之外的所有内容都有关系,后者可能与memoryOverhead或应用程序主内存相关。

在我的情况下,增加spark.yarn.executor.memoryOverheadspark.yarn.driver.memoryOverhead没有帮助,因为可能是我的应用程序主机(AM)内存不足。在yarn-client模式下,增加AM内存的配置为spark.yarn.am.memory。对于yarn-cluster模式,它是驱动程序内存。这就是它对我有用的方式。

这是对我得到的错误的引用:

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.