2013-01-01 67 views
4

我在玩分佈式shell應用程序(hadoop-2.0.0-cdh4.1.2)。 這是我目前收到的錯誤。AM容器超出虛擬內存限制

13/01/01 17:09:09 INFO distributedshell.Client: Got application report from ASM for, appId=5, clientToken=null, appDiagnostics=Application application_1357039792045_0005 failed 1 times due to AM Container for appattempt_1357039792045_0005_000001 exited with exitCode: 143 due to: Container [pid=24845,containerID=container_1357039792045_0005_01_000001] is running beyond virtual memory limits. Current usage: 77.8mb of 512.0mb physical memory used; 1.1gb of 1.0gb virtual memory used. Killing container. 
Dump of the process-tree for container_1357039792045_0005_01_000001 : 
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE 
|- 24849 24845 24845 24845 (java) 165 12 1048494080 19590 /usr/java/bin/java -Xmx512m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster --container_memory 128 --num_containers 1 --priority 0 --shell_command ping --shell_args localhost --debug 
|- 24845 23394 24845 24845 (bash) 0 0 108654592 315 /bin/bash -c /usr/java/bin/java -Xmx512m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster --container_memory 128 --num_containers 1 --priority 0 --shell_command ping --shell_args localhost --debug 1>/tmp/logs/application_1357039792045_0005/container_1357039792045_0005_01_000001/AppMaster.stdout 2>/tmp/logs/application_1357039792045_0005/container_1357039792045_0005_01_000001/AppMaster.stderr 

的有趣的是,似乎有與設置沒有問題,因爲一個簡單的lsuname命令成功完成,並在標準輸出container2的輸出是可用的。

關於設置,yarn.nodenamager.vmem-pmem-ratio3和可用的總物理內存是2GB,我認爲這是足夠譬如運行。

對於命令的問題,「平本地主機」產生的兩條回覆,因爲它可以從containerlogs/container_1357039792045_0005_01_000002/721917/stdout/?start=-4096.

因此可以看出,可能是什麼問題呢?

回答

0

好的,知道了。將主memry參數增加到更多tan 750MB,您將成功運行YARN應用程序。

+8

提及哪些參數以及哪些參考資料在哪裏找到是很有幫助的。 – ykesh

7

從錯誤消息中,您可以看到您使用的虛擬內存超過了當前的1.0GB限制。這可以從兩個方面來解決:

禁用虛擬內存限制檢查

YARN將完全忽略了極限;爲了做到這一點,添加到您的yarn-site.xml

<property> 
    <name>yarn.nodemanager.vmem-check-enabled</name> 
    <value>false</value> 
    <description>Whether virtual memory limits will be enforced for containers.</description> 
</property> 

此設置的默認值是true

增加虛擬內存到物理內存比

在你yarn-site.xml改變這比目前設定一個較高的值

<property> 
    <name>yarn.nodemanager.vmem-pmem-ratio</name> 
    <value>5</value> 
    <description>Ratio between virtual memory to physical memory when setting memory limits for containers. Container allocations are expressed in terms of physical memory, and virtual memory usage is allowed to exceed this allocation by this ratio.</description> 
</property> 

默認爲2.1

你也可能會增加您分配給容器的物理內存量。

確保您在更改配置後不要忘記重新啓動紗線。

+0

這個解決方案正好與tmlye一樣。萬分感謝!節省了我很多時間。注意 - 你必須重啓紗線stop-yarn.sh/start-yarn.sh – Mata

10

無需更改羣集配置。我發現只是提供額外的參數

-Dmapreduce.map.memory.mb=4096 

distcp幫了我。

+1

謝謝,你救了我的命:)我想我必須改變配置並重新啓動整個集羣,但增加內存在我的情況下工作以及。還運行'distcp'。 –

+0

很高興幫助!我意識到原來的問題不是'distcp',但我認爲它應該有相同的解決方案基本相同的問題。 –

+0

也幫了我。謝謝! –

2

如果您正在運行TEZ框架,它必須設在TEZ-site.xml中的以下參數

tez.am.resource.memory.mb 
tez.task.resource.memory.mb 
tez.am.java.opts 

而且在紗線現場。XML

yarn.nodemanager.resource.memory-mb 
yarn.scheduler.minimum-allocation-mb 
yarn.scheduler.maximum-allocation-mb 
yarn.nodemanager.vmem-check-enabled 
yarn.nodemanager.vmem-pmem-ratio 

所有這些參數是強制設置

0

可以將此比默認的1 GB在紗線的site.xml

yarn.app.mapreduce.am更改爲更高的價值。 resource.mb