1. 程式人生 > >Hadoop YARN中內存的設置

Hadoop YARN中內存的設置

val ont 參考 task ren tac cer sent ever

在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調度器負責資源的分配,而NodeManager則負責資源的供給和隔離。ResourceManager將某個NodeManager上資源分配給任務(這就是所謂的“資源調度”)後,NodeManager需按照要求為任務提供相應的資源,甚至保證這些資源應具有獨占性,為任務運行提供基礎的保證,這就是所謂的資源隔離。

基於以上考慮,YARN允許用戶配置每個節點上可用的物理內存資源,註意,這裏是“可用的”,因為一個節點上的內存會被若幹個服務共享,比如一部分給YARN,一部分給HDFS,一部分給HBase等,YARN配置的只是自己可以使用的,配置參數如下:

(1)yarn.nodemanager.resource.memory-mb

表示該節點上YARN可使用的物理內存總量,默認是8192(MB),註意,如果你的節點內存資源不夠8GB,則需要調減小這個值,而YARN不會智能的探測節點的物理內存總量。

(2)yarn.nodemanager.vmem-pmem-ratio

任務每使用1MB物理內存,最多可使用虛擬內存量,默認是2.1。

(3) yarn.nodemanager.pmem-check-enabled

是否啟動一個線程檢查每個任務正使用的物理內存量,如果任務超出分配值,則直接將其殺掉,默認是true。

(4) yarn.nodemanager.vmem-check-enabled

是否啟動一個線程檢查每個任務正使用的虛擬內存量,如果任務超出分配值,則直接將其殺掉,默認是true。

(5)yarn.scheduler.minimum-allocation-mb

單個任務可申請的最少物理內存量,默認是1024(MB),如果一個任務申請的物理內存量少於該值,則該對應的值改為這個數。

(6)yarn.scheduler.maximum-allocation-mb

單個任務可申請的最多物理內存量,默認是8192(MB)。

默認情況下,YARN采用了線程監控的方法判斷任務是否超量使用內存,一旦發現超量,則直接將其殺死。由於Cgroups對內存的控制缺乏靈活性(即任務任何時刻不能超過內存上限,如果超過,則直接將其殺死或者報OOM),而Java進程在創建瞬間內存將翻倍,之後驟降到正常值,這種情況下,采用線程監控的方式更加靈活(當發現進程樹內存瞬間翻倍超過設定值時,可認為是正常現象,不會將任務殺死),因此YARN未提供Cgroups內存隔離機制。

可以使用如下命令在提交任務時動態設置:

hadoop jar <jarName> -D mapreduce.reduce.memory.mb=5120

e.g.

[hadoop@cMaster hadoop-2.5.2]$ ./bin/hadoop jar /home/hadoop/jar-output/TestLoop-1024M.jar -D mapreduce.map.memory.mb=5120 AESEnTest 1024 1 1

後面的1024及兩個1均為jar的輸入參數。

Hadoop2.5.2搭建好之後,運行寫好的MapReduce程序出現如下問題:

Container [pid=24156,containerID=container_1427332071311_0019_01_000002] is running beyond physical memory limits. Current usage: 2.1 GB of 2 GB physical memory used; 2.7 GB of 4.2 GB virtual memory used. Killing container.
Dump of the process-tree for container_1427332071311_0019_01_000002 :
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
|- 24156 2787 24156 24156 (bash) 0 0 108646400 296 /bin/bash -c /usr/java/jdk1.7.0_45/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx2048m -Djava.io.tmpdir=/home/hadoop/hadoop-2.5.2/hadoop-hadoop/nm-local-dir/usercache/hadoop/appcache/application_1427332071311_0019/container_1427332071311_0019_01_000002/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/home/hadoop/hadoop-2.5.2/logs/userlogs/application_1427332071311_0019/container_1427332071311_0019_01_000002 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 192.168.199.93 33497 attempt_1427332071311_0019_m_000000_0 2 1>/home/hadoop/hadoop-2.5.2/logs/userlogs/application_1427332071311_0019/containe...

分析:

根據前面所述的內存配置相關理論知識,我們可以總結如下:

(RM, Resource Manager; NM, Node Manager; AM, Application Manager)

RM內存資源配置——兩個參數(yarn-site.xml)

<property>
<description>The minimum allocation for every container request at the RM,
in MBs. Memory requests lower than this won‘t take effect,
and the specified value will get allocated at minimum.</description>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>


<property>
<description>The maximum allocation for every container request at the RM,
in MBs. Memory requests higher than this won‘t take effect,
and will get capped to this value.</description>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>

它們表示單個容器可以申請的最小與最大內存。

NM(yarn-site.xml)

<property>
<description>Amount of physical memory, in MB, that can be allocated
for containers.</description>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>

<property>
<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>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>

前者表示單個節點可用的最大內存,RM中的兩個值都不應該超過該值。

後者表示虛擬內存率,即占task所用內存的百分比,默認為2.1.

AM(mapred-site.xml)

mapreduce.map.memory.mb

mapreduce.reduce.memory.mb

指定map和reduce task的內存大小,該值應該在RM的最大最小container之間。如果不設置,則默認用以下規則進行計算:max{MIN_Container_Size,(Total Available RAM/containers)}。

一般地,reduce設置為map的兩倍。

AM的其他參數設置:

mapreduce.map.java.opts

mapreduce.reduce.java.opts

這兩個參數是偽需要運行JVM程序(java,scala等)準備,通過這兩個參數可以向JVM中傳遞參數,與內存有關的是-Xmx, -Xms等選項,數值的大小應該要再AM中的map.mb和reduce.mb之間。

對如上問題,我選擇使用以下方式來解決:(根據提交的job動態設置mapreduce.map.memory.mb的值)

[hadoop@cMaster hadoop-2.5.2]$ ./bin/hadoop jar /home/hadoop/jar-output/TestLoop-1024M.jar -D mapreduce.map.memory.mb=5120 AESEnTest 1024 1 1

參考資料:

https://altiscale.zendesk.com/hc/en-us/articles/200801519-Configuring-Memory-for-Mappers-and-Reducers-in-Hadoop-2

http://stackoverflow.com/questions/21005643/container-is-running-beyond-memory-limits

http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-memory-cpu-scheduling/

Hadoop YARN中內存的設置