YARN集群的每个slave节点都运行了名为NodeManager的守护进程,而NodeManager进程的一个职责就是监控运行在那个几点上的YARN containers,其中就包括了监控每个容器的内存使用。
yarn.nodemanager.container-monitor.interval-ms
)循环遍历所有当前正在运行的容器,计算进程树(process tree,也就是每个容器所有的子进程),对于每个进程检查 /proc/<pid>/stat
yarn.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将会被这个容器杀掉,同时出现以下错误信息:
|
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
|
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
|