天天看点

Yarn 内存分配管理机制及相关参数配置

关于yarn内存分配与管理,主要涉及到了resourcemanage、applicationmatser、nodemanager这几个概念,相关的优化也要紧紧围绕着这几方面来开展。这里还有一个container的概念,现在可以先把它理解为运行map/reduce task的容器,后面有详细介绍。

<code>rm1:yarn.scheduler.minimum-allocation-mb</code> 分配给am单个容器可申请的最小内存

<code>rm2:yarn.scheduler.maximum-allocation-mb</code> 分配给am单个容器可申请的最大内存

注:

最小值可以计算一个节点最大container数量

一旦设置,不可动态改变

<code>nm1:yarn.nodemanager.resource.memory-mb</code> 节点最大可用内存

<code>nm2:yarn.nodemanager.vmem-pmem-ratio</code> 虚拟内存率,默认2.1

rm1、rm2的值均不能大于nm1的值

nm1可以计算节点最大最大container数量,max(container)=nm1/rm1

<code>am1:mapreduce.map.memory.mb</code> 分配给map container的内存大小

<code>am2:mapreduce.reduce.memory.mb</code> 分配给reduce container的内存大小

这两个值应该在rm1和rm2这两个值之间

am2的值最好为am1的两倍

这两个值可以在启动时改变

<code>am3:mapreduce.map.java.opts</code> 运行map任务的jvm参数,如-xmx,-xms等选项

<code>am4:mapreduce.reduce.java.opts</code> 运行reduce任务的jvm参数,如-xmx,-xms等选项

这两个值应该在am1和am2之间

知道有这些参数,还需理解其如何分配,下面我就一副图让大家更形象的了解各个参数的含义。

Yarn 内存分配管理机制及相关参数配置

如上图所示,先看最下面褐色部分,

am参数<code>mapreduce.map.memory.mb=1536mb</code>,表示am要为map container申请1536mb资源,但rm实际分配的内存却是2048mb,因为<code>yarn.scheduler.mininum-allocation-mb=1024mb</code>,这定义了rm最小要分配1024mb,1536mb超过了这个值,所以实际分配给am的值为2048mb(这涉及到了规整化因子,关于规整化因子,在本文最后有介绍)。

am参数<code>mapreduce.map.java.opts=-xmx 1024m</code>,表示运行map任务的jvm内存为1024mb,因为map任务要运行在container里面,所以这个参数的值略微小于<code>mapreduce.map.memory.mb=1536mb</code>这个值。

nm参数<code>yarn.nodemanager.vmem-pmem-radio=2.1</code>,这表示nodemanager可以分配给map/reduce container 2.1倍的虚拟内存,安照上面的配置,实际分配给map container容器的虚拟内存大小为2048*2.1=3225.6mb,若实际用到的内存超过这个值,nm就会kill掉这个map container,任务执行过程就会出现异常。

am参数<code>mapreduce.reduce.memory.mb=3072mb</code>,表示分配给reduce container的容器大小为3072mb,而map container的大小分配的是1536mb,从这也看出,reduce container容器的大小最好是map container大小的两倍。

nm参数<code>yarn.nodemanager.resource.mem.mb=24576mb</code>,这个值表示节点分配给nodemanager的可用内存,也就是节点用来执行yarn任务的内存大小。这个值要根据实际服务器内存大小来配置,比如我们hadoop集群机器内存是128gb,我们可以分配其中的80%给yarn,也就是102gb。

上图中rm的两个参数分别1024mb和8192mb,分别表示分配给am map/reduce container的最大值和最小值。

步骤1:用户将应用程序提交到resourcemanager上;

步骤2:resourcemanager为应用程序applicationmaster申请资源,并与某个nodemanager通信,以启动applicationmaster;

步骤3:applicationmaster与resourcemanager通信,为内部要执行的任务申请资源,一旦得到资源后,将于nodemanager通信,以启动对应的任务。

步骤4:所有任务运行完成后,applicationmaster向resourcemanager注销,整个应用程序运行结束。

Yarn 内存分配管理机制及相关参数配置

(1)container是yarn中资源的抽象,它封装了某个节点上一定量的资源(cpu和内存两类资源)。它跟linux container没有任何关系,仅仅是yarn提出的一个概念(从实现上看,可看做一个可序列化/反序列化的java类)。

(2)container由applicationmaster向resourcemanager申请的,由resoucemanager中的资源调度器异步分配给applicationmaster;

(3)container的运行是由applicationmaster向资源所在的nodemanager发起的,container运行时需提供内部执行的任务命令(可以使任何命令,比如java、python、c++进程启动命令均可)以及该命令执行所需的环境变量和外部资源(比如词典文件、可执行文件、jar包等)。

另外,一个应用程序所需的container分为两大类,如下:

(1) 运行applicationmaster的container:这是由resourcemanager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的applicationmaster所需的资源;

(2)运行各类任务的container:这是由applicationmaster向resourcemanager申请的,并由applicationmaster与nodemanager通信以启动之。

以上两类container可能在任意节点上,它们的位置通常而言是随机的,即applicationmaster可能与它管理的任务运行在一个节点上。

container是yarn中最重要的概念之一,懂得该概念对于理解yarn的资源模型至关重要,望大家好好理解。

注意:如下图,map/reduce task是运行在container之中的,所以上面提到的mapreduce.map(reduce).memory.mb大小都大于mapreduce.map(reduce).java.opts值的大小。

Yarn 内存分配管理机制及相关参数配置

根据上面介绍的相关知识,我们就可以根据我们的实际情况作出相关参数的设置,当然还需要在运行测试过程中不断检验和调整。

以下是hortonworks给出的配置建议:

<a href="http://docs.hortonworks.com/hdpdocuments/hdp2/hdp-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html">http://docs.hortonworks.com/hdpdocuments/hdp2/hdp-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html</a>

reserved memory = reserved for stack memory + reserved for hbase memory (if hbase is on the same node)

系统总内存126gb,预留给操作系统24gb,如果有hbase再预留给hbase24gb。

下面的计算假设datanode节点部署了hbase。

container 内存计算:

附:规整化因子介绍

为了易于管理资源和调度资源,hadoop yarn内置了资源规整化算法,它规定了最小可申请资源量、最大可申请资源量和资源规整化因子,如果应用程序申请的资源量小于最小可申请资源量,则yarn会将其大小改为最小可申请量,也就是说,应用程序获得资源不会小于自己申请的资源,但也不一定相等;如果应用程序申请的资源量大于最大可申请资源量,则会抛出异常,无法申请成功;规整化因子是用来规整化应用程序资源的,应用程序申请的资源如果不是该因子的整数倍,则将被修改为最小的整数倍对应的值,公式为ceil(a/b)*b,其中a是应用程序申请的资源,b为规整化因子。

比如,在yarn-site.xml中设置,相关参数如下:

对于规整化因子,不同调度器不同,具体如下:

fifo和capacity scheduler,规整化因子等于最小可申请资源量,不可单独配置。

fair scheduler:规整化因子通过参数<code>yarn.scheduler.increment-allocation-mb</code>和<code>yarn.scheduler.increment-allocation-vcores</code>设置,默认是1024和1。

通过以上介绍可知,应用程序申请到资源量可能大于资源申请的资源量,比如yarn的最小可申请资源内存量为1024,规整因子是1024,如果一个应用程序申请1500内存,则会得到2048内存,如果规整因子是512,则得到1536内存。