实际遇到的真实问题,解决方法:html
1.调整虚拟内存率yarn.nodemanager.vmem-pmem-ratio (这个hadoop默认是2.1)java
2.调整map与reduce的在AM中的大小大于yarn里RM可分配的最小值yarn.scheduler.minimum-allocation-mb 大小由于在Container中计算使用的虚拟内存来自node
map虚拟内大小=max(yarn.scheduler.minimum-allocation-mb,mapreduce.map.memory.mb) * yarn.nodemanager.vmem-pmem-ratio,同理reduce虚拟内存大小也是这样计算...oop
具体说明相关参数含义[文章参考:http://blog.chinaunix.net/uid-25691489-id-5587957.html与https://blog.csdn.net/u012042963/article/details/53099638]:ui
ResourceManager配置:spa
RM的内存资源配置,主要是经过下面的两个参数进行的(这两个值是Yarn平台特性,应在yarn-site.xml中配置好):操作系统
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb.net
说明:单个容器可申请的最小与最大内存,应用在运行申请内存时不能超过最大值,小于最小值则分配最小值,从这个角度看,最小值有点想操做系统中的页;scala
最小值还有另一种用途,计算一个节点的最大container数目。注!!:这两个值一经设定不能动态改变(此处所说的动态改变是指应用运行时)。unix
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是调节虚拟内存率或者应用运行时调节内存大小。
这个调整对应用很是有用!!!