理解Yarn的内存管理与分配机制,对于我们搭建、部署集群,开发维护应用都是尤为重要的,对于这方面我做了一些调研供大家参考。
一、相关配置情况
1.1 RM的内存资源配置, 配置的是资源调度相关
RM1:yarn.scheduler.minimum-allocation-mb 分配给AM单个容器可申请的最小内存
RM2:yarn.scheduler.maximum-allocation-mb 分配给AM单个容器可申请的最大内存
注:最小值可以计算一个节点最大Container数量 , 一旦设置,不可动态改变
1.2 NM的内存资源配置,配置的是硬件资源相关
NM1:yarn.nodemanager.resource.memory-mb 节点最大可用内存
NM2:yarn.nodemanager.vmem-pmem-ratio 虚拟内存率,默认2.1
注:
RM1、RM2的值均不能大于NM1的值
NM1可以计算节点最大最大Container数量,max(Container)=NM1/RM2
一旦设置,不可动态改变
1.3 AM内存配置相关参数,配置的是任务相关
AM1:mapreduce.map.memory.mb 分配给map Container的内存大小
AM2:mapreduce.reduce.memory.mb 分配给reduce Container的内存大小
这两个值应该在RM1和RM2这两个值之间
AM2的值最好为AM1的两倍
这两个值可以在启动时改变
AM3:mapreduce.map.java.opts 运行map任务的jvm参数,如-Xmx,-Xms等选项
AM4:mapreduce.reduce.java.opts 运行reduce任务的jvm参数,如-Xmx,-Xms等选项
注:
1.这两个值应该在AM1和AM2之间
二、根据前面所述的内存配置相关理论知识,我们可以总结如下:
1. RM内存资源配置——两个参数(yarn-site.xml)
in MBs. Memory requests lower than this won't take effect,
and the specified value will get allocated at minimum.
in MBs. Memory requests higher than this won't take effect,
and will get capped to this value.
它们表示单个容器可以申请的最小与最大内存。
2. NM(yarn-site.xml)
for containers.
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.
前者表示单个节点可用的最大内存,RM中的两个值都不应该超过该值。
后者表示虚拟内存率,即占task所用内存的百分比,默认为2.1.
3. 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之间。
虚拟内存
默认的(“yarn.nodemanager.vmem-pmem-ratio“)设置为2.1,意味则map container或者reduce container分配的虚拟内存超过2.1倍的(“mapreduce.reduce.memory.mb“)或(“mapreduce.map.memory.mb“)就会被NM给KILL掉,如果 (“mapreduce.map.memory.mb”) 被设置为1536那么总的虚拟内存为2.1*1536=3225.6MB
当container的内存超出要求的,log将会打印一下信息
Current usage: 2.1gb of 2.0gb physical memory used; 1.6gb of 3.15gb virtual memory used. Killing container.