YARN集群的每个slave节点都运行了名为NodeManager的守护进程,而NodeManager进程的一个职责就是监控运行在那个几点上的YARN containers,其中就包括了监控每个容器的内存使用。

yarn.nodemanager.container-monitor.interval-ms)循环遍历所有当前正在运行的容器,计算进程树(process tree,也就是每个容器所有的子进程),对于每个进程检查 /proc/<pid>/statyarn.nodemanager.vmem-check-enabled 修改),然后YARN将把抽取出来的容器及其子进程的VSIZE加起来和容器最大允许使用的虚拟内存进行比较。最大允许使用的虚拟内存是容器最大可使用的物理内存乘以 yarn.nodemanager.vmem-pmem-ratio(默认值是2.1)。所以,如果你的YARN容器配置的最大可使用物理内存为2GB,然后我们乘以 2.1 得到的就是容器最大可用的虚拟内存 4.2G。yarn.nodemanager.pmem-check-enabled

  如果物理内存或者虚拟内存其中一个的使用大于最大允许使用的,YARN将会被这个容器杀掉,同时出现以下错误信息:

       

Application application_1409135750325_48141 failed 2        times        due to AM Container        for      


       appattempt_1409135750325_48141_000002 exited with exitCode: 143 due to: Container      


       [pid=4733,containerID=container_1409135750325_48141_02_000001] is running beyond physical memory limits.      


       Current usage: 2.0 GB of 2 GB physical memory used; 6.0 GB of 4.2 GB virtual memory used. Killing container.





  

Yarn集群的内存分配配置在yarn-site.xml文件中配置:

<property>
		<name>yarn.nodemanager.resource.memory-mb</name>
		<value>22528</value>
		<discription>每个节点可用内存,单位MB</discription>
	</property>
	
	<property>
		<name>yarn.scheduler.minimum-allocation-mb</name>
		<value>1500</value>
		<discription>单个任务(container)可申请最少内存,默认1024MB</discription>
	</property>
	
	<property>
		<name>yarn.scheduler.maximum-allocation-mb</name>
		<value>16384</value>
		<discription>单个任务(container)可申请最大内存,默认8192MB</discription>
	</property>

mapreduce.map.memory.mb 和 mapreduce.reduce.memory.mb 参数来限制物理内存的大小。比如如果你想在集群中默认将Map进程的内存限制为2GB,而Reduce进程的内存限制为4GB,那么你可以在 mapred-site.xml


<         property         >        


                  <         name         >mapreduce.map.memory.mb</         name         >        


                  <         value         >2048</         value         >        


         </         property         >        


                  


         <         property         >        


                  <         name         >mapreduce.reduce.memory.mb</         name         >        


                  <         value         >4096</         value         >        


         </         property         >



yarn.scheduler.maximum-allocation-mb 和 yarn.scheduler.minimum-allocation-mb

设置Map和Reduce进程的JVM堆大小

  接下来你需要为你的 map 和 reduce 进程设置JVM堆大小。JVM堆大小需要小于进程的物理内存大小;根据经验,我们一般把它设置成物理内存的80%。

mapreduce.map.java.opts 和 mapreduce.reduce.java.opts 参数来分别设置 Map 和 Reduce 进程的JVM堆大小。比如我们上面已经将 Map 和 Reduce 的物理内存分别设置为 2GB 和 4GB 了;所以我们可以在 mapred-site.xml


<         property         >        


                  <         name         >mapreduce.map.java.opts</         name         >        


                  <         value         >-Xmx1638m</         value         >        


         </         property         >        


                  


         <         property         >        


                  <         name         >mapreduce.reduce.java.opts</         name         >        


                  <         value         >-Xmx3278m</         value         >        


         </         property         >