標籤:blog http java 使用 io strong 檔案 for ar
hadoop2.0 yarn 記憶體溢出問題解決
異常提示:
Container [pid=20170,containerID=container_1390877171119_0002_01_000005] is running beyond virtual memory limits. Current usage: 416.8 MB of 1 GB physical memory used; 2.7 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1390877171119_0002_01_000005 :
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
|- 20175 20170 20170 20170 (java) 939 42 2806788096 106404 /usr/local/jdk/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx2048M -Djava.io.tmpdir=/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1390877171119_0002/container_1390877171119_0002_01_000005/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1390877171119_0002/container_1390877171119_0002_01_000005 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 10.100.2.9 34637 attempt_1390877171119_0002_m_000001_1 5
|- 20170 19734 20170 20170 (bash) 0 0 108646400 301 /bin/bash -c /usr/local/jdk/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx2048M -Djava.io.tmpdir=/home/hadoop/hadoop-2.2.0/tmp/nm-local-dir/usercache/hadoop/appcache/application_1390877171119_0002/container_1390877171119_0002_01_000005/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1390877171119_0002/container_1390877171119_0002_01_000005 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 10.100.2.9 34637 attempt_1390877171119_0002_m_000001_1 5 1>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1390877171119_0002/container_1390877171119_0002_01_000005/stdout 2>/home/hadoop/hadoop-2.2.0/logs/userlogs/application_1390877171119_0002/container_1390877171119_0002_01_000005/stderr
Container killed on request. Exit code is 143
1. io.file.buffer.size 的設定問題
io.file.buffer.size 的值設定過大,map和reduce的任務可能會存在溢出。我這個值的設定是128k,其實不大,後來改成4k仍然出現異常證明不是這個問題. (io.file.buffer.size作為hadoop緩衝區,用於 hadoop讀hdfs的檔案和寫hdfs的檔案,還有map的輸出都用到了這個緩衝區容量)
2. yarn的虛擬記憶體計算方式導致
這個問題應該是導致running beyond virtual memory limits.雖然沒有解決問題,但感覺不知道這個的人很容易被坑的
running beyond virtual memory limits. Current usage: 32.1mb of 1.0gb physical memory used; 6.2gb of 2.1gb virtual memory used. Killing container。
該錯誤是YARN的虛擬記憶體計算方式導致,上例中使用者程式申請的記憶體為1Gb,YARN根據此值乘以一個比例(預設為2.1)得出申請的虛擬記憶體的 值,當YARN計算的使用者程式所需虛擬記憶體值大於計算出來的值時,就會報出以上錯誤。調節比例值可以解決該問題。具體參數為:yarn-site.xml 中的yarn.nodemanager.vmem-pmem-ratio
3.記憶體監控的問題
看到網上有人說,hadoop有個記憶體監控,可以設定當task,map,reduce or job 的累計使用的記憶體量大於limit的時候kill 程式。
第一,我增加了一倍reduce的數目,試著跑了一下,successed
第二,我保持之前的reduce的數目,在mapred-site.xml 設定檔中加入了兩段語句 同樣successed
<property>
<name>mapreduce.cluster.map.memory.mb</name>
<value>-1</value>
</property>
<property>
<name>mapreduce.cluster.reduce.memory.mb</name>
<value>-1</value>
</property>
第一個目的很明顯是分攤每個reduce的累計記憶體使用量量
第二個的目的是關閉監控機制,只有值大於0的時候才會啟動,當然預設值是-1,
只不過我設定了mapreduce.{map|reduce}.memory.mb。 看大神的部落格裡有這麼一句話“They typically match the default values set for the options mapreduce.{map|reduce}.memory.mb。”
只是對於官網文檔上的此配置解釋的 vitual memory還有一點疑惑。
關於記憶體配置 見
http://blog.csdn.net/amaowolf/article/details/7188504
hadoop 點點滴滴(二)