2015-02-09 55 views
3

如果紗線容器的增長超過其堆大小的設置,地圖或減少任務將失敗,類似於下面的一個錯誤:紗線 - 爲什麼沒有任務走出堆空間,但容器被殺死?

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://[email protected]: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://[email protected]: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 

有趣的是,要注意各個階段完成後,就在保存當序列文件被調用時,它會失敗。執行者沒有佔用堆空間,想知道還有什麼東西在吃東西?

+0

該容器是這樣嗎? – SMA 2015-02-09 07:26:44

+0

火花容器 – Dragonborn 2015-02-09 07:28:51

回答

3

Spark執行程序一直被殺死,Spark不斷重試失敗階段。對於Spark on YARN,如果nodemanager使用的內存大於「spark.executor.memory」+「spark.yarn.executor.memoryOverhead」的配置大小,則它將終止Spark執行程序。增加「spark.yarn.executor.memoryOverhead」以確保它覆蓋了執行程序堆內存使用情況。

的一些問題:

+1

這是一個很好的分析。但是,如果您看到OP的容器正在耗盡物理內存而不是虛擬內存。所以如果他只是在yarn-site.xml中禁用'yarn.nodemanager.pmem-check-enabled',那麼nodemanager應該保持容器直到168GB的虛擬內存被擊中。我有同樣的問題,我嘗試過,但它沒有奏效。 spark工作不遵守虛擬內存限制。 – nir 2016-03-01 13:18:49

+0

'memoryOverhead'究竟是什麼?我在doc中看到「每個執行程序分配的堆內存量(以兆字節爲單位),這是佔用VM開銷,字符串間隔,其他本地開銷等等的內存。這往往隨執行程序大小通常爲6-10%)「但是爲什麼在我的某些情況下,字符串和虛擬機開銷會超過10%,因爲我的執行程序內存仍然會失敗10%。 – nir 2016-03-01 17:52:59

2

你實際上是運行容器的物理內存在這種情況下:

當前使用情況:42.1 GB 42 GB的使用的物理內存

虛擬內存不是限制因素。您必須增加容器的堆大小或增加spark.yarn.executor.memoryOverhead,以便在不增加執行程序堆大小的情況下爲YARN容器提供更多空間。

0

我面臨與OP完全相同的問題,所有階段都成功了,只有在保存並寫入結果時,容器纔會被殺死。

如果超出了java堆內存,您將看到OutOfMemory異常,但是除Java堆內存之外的其他所有內容都可能與內存Overhead或應用程序主內存有關。

在我的情況下增加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. 
相關問題