實際遇到的真實問題,解決方法:
1.調整虛擬內存率yarn.nodemanager.vmem-pmem-ratio (這個hadoop默認是2.1)
2.調整map與reduce的在AM中的大小大於yarn里RM可分配的最小值yarn.scheduler.minimum-allocation-mb 大小因為在Container中計算使用的虛擬內存來自
map虛擬內大小=max(yarn.scheduler.minimum-allocation-mb,mapreduce.map.memory.mb) * yarn.nodemanager.vmem-pmem-ratio,同理reduce虛擬內存大小也是這樣計算...
具體說明相關參數含義[文章參考:http://blog.chinaunix.net/uid-25691489-id-5587957.html與https://blog.csdn.net/u012042963/article/details/53099638]:
ResourceManager配置:
RM的內存資源配置,主要是通過下面的兩個參數進行的(這兩個值是Yarn平台特性,應在yarn-site.xml中配置好):
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
說明:單個容器可申請的最小與最大內存,應用在運行申請內存時不能超過最大值,小於最小值則分配最小值,從這個角度看,最小值有點想操作系統中的頁;
最小值還有另外一種用途,計算一個節點的最大container數目。注!!:這兩個值一經設定不能動態改變(此處所說的動態改變是指應用運行時)。
NodeManager配置:
NM的內存資源配置,主要是通過下面兩個參數進行的(這兩個值是Yarn平台特性,應在yarn-sit.xml中配置) :
yarn.nodemanager.resource.memory-mb ===>每個節點可用的最大內存
yarn.nodemanager.vmem-pmem-ratio ===>虛擬內存率
說明:每個節點可用的最大內存:
RM中的兩個值(yarn.scheduler.minimum-allocation-mb與yarn.scheduler.maximum-allocation-mb)不應該超過此值,
此數值可以用於計算container最大數目,即:用此值除以RM中的最小容器內存;
虛擬內存率:
是占task所用內存的百分比,默認值為2.1倍,
注意!!:第一個參數是不可修改的,一旦設置,整個運行過程中不可動態修改,且該值的默認大小是8G,即使計算機內存不足8G也會按着8G內存來使用。
ApplicationMaster配置:
AM內存配置相關參數,此處以MapReduce為例進行說明(這兩個值是AM特性,應在mapred-site.xml中配置),如下:
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
說明:這兩個參數指定用於MapReduce的兩個任務(Map and Reduce task)的內存大小,其值應該在RM中的最大(yarn.scheduler.maximum-allocation-mb)最小(yarn.scheduler.minimum-allocation-mb)container之間,如果沒有配置則通過如下簡單公式獲得:
max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
一般的reduce應該是map的2倍。
注!!:這兩個值可以在應用啟動時通過參數改變
AM中JVM相關設置:
AM中其它與內存相關的參數,還有JVM相關的參數,這些參數可以通過如下選項配置:
mapreduce.map.java.opts
mapreduce.reduce.java.opts
說明:這兩個參主要是為需要運行JVM程序(java、scala等)准備的,通過這兩個設置可以向JVM中傳遞參數的,與內存有關的是,-Xmx,-Xms等選項;此數值大小,應該在AM中的mapreduce.map.memory.mb和mapreduce.reduce.memory.mb之間。
實際案例:
Container [pid=108284,containerID=container_e19_1533108188813_12125_01_000002] is running beyond virtual memory limits. Current usage: 653.1 MB of 2 GB physical memory used; 5.4 GB of 4.2 GB virtual memory used. Killing container.
<property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>2.1</value> <source>yarn-default.xml</source> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> <source>yarn-default.xml</source> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>8192</value> <source>yarn-default.xml</source> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> <source>yarn-default.xml</source> </property> <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> <source>mapred-default.xml</source> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>1024</value> <source>mapred-default.xml</source> </property>
通過配置我們看到,容器的最小內存和最大內存分別為:1024m和8192m,而reduce設置的默認值為1024m,map也是默認值,所以兩個值都為1024m,所以兩個值和為2G即是log中" 653.1 MB of 2 GB physical memory used" 這個2G。而由於使用了默認虛擬內存率(也就是2.1倍),所以對於Map Task和Reduce Task總的虛擬內存為都為2*2.1=4.2G,這個4.2也是log中的"5.4 GB of 4.2 GB virtual memory used" 計算的這個虛擬內存。而應用的虛擬內存超過了這個數值,故報錯 。解決辦法:在啟動Yarn是調節虛擬內存率或者應用運行時調節內存大小
另外一個案例:
Container[pid=41884,containerID=container_1405950053048_0016_01_000284] is running beyond virtual memory limits. Current usage: 314.6 MB of 2.9 GB physical memory used; 8.7 GB of 6.2 GB virtual memory used. Killing container.
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>100000</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>10000</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>3000</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2000</value> </property>
通過配置我們看到,容器的最小內存和最大內存分別為:3000m和10000m,而reduce設置的默認值小於2000m,map沒有設置,所以兩個值均為3000m,也就是log中的“2.9 GB physical
memory used”。而由於使用了默認虛擬內存率(也就是2.1倍),所以對於Map Task和Reduce Task總的虛擬內存為都為3000*2.1=6.2G。而應用的虛擬內存超過了這個數值,故報錯 。解決辦
法:在啟動Yarn是調節虛擬內存率或者應用運行時調節內存大小。
這個調整對應用非常有用!!!
