Yarn下MapReduce部分参数理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yarn下MapReduce部分参数理解相关的知识,希望对你有一定的参考价值。

参考技术A

部分原文来自 support.pivotal.io 的翻译,对于该篇文章中感觉概念模糊不清的地方我做了修正,并扩充了我自己的部分理解,有不正确的地方还望大家指正

Yarn Container就是一个yarn的java进程(这里容易被误解成类似Linux Container的概念),在Mapreduce中的AM,MapTask,ReduceTask, spark的driver和executor等等都作为Container在Yarn的框架上执行,你可以在RM的网页上看到Container的状态。

从上面的图可以看出map,reduce,AM container的JVM,“JVM”矩形代表服务进程,“Max heap”,“Max virtual”矩形代表NodeManager对JVM进程的最大内存和虚拟内存的限制。

以map container内存分配(“mapreduce.map.memory.mb“)设置为1536M为例,AM将会为container向RM请求2048mb的内存资源(原因见上)。这是一种逻辑上的分配,这个值被NodeManager用来监控改进程内存资源的使用率, 如果Task进程树(包括task启动子进程占用的内存,这样可以解决hadoop streaming任务内存跑飞的情况,实际上是对内存使用的一种软限制,至于为什么没有使用Cgroups做限制,大家可以自行查阅资料)的使用超过了2048MB ,NM将会把这个task给杀掉。

mapreduce.map.java.opts和mapreduce.map.memory.mb区别:JVM进程跑在container中, mapreduce.map|reduce.java.opts能够通过Xmx设置JVM最大的heap的使用,一般设置为0.75倍的 mapreduce.map|reduce.memory.mb ,因为需要为java code,非JVM内存使用等预留些空间,同理:spark executor在申请内存是也会为堆外内存预留一些空间,参数由 spark.yarn.executor.memoryOverhead 控制,算法为 max(384m, 0.07*spark.executor.memory) **

当一个mapreduce job完成时,你将会看到一系列的计数器被打印出来,下面的三个计数器展示了多少物理内存和虚拟内存被分配

默认的(“ 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 ”) 被设置为1536M那么总的虚拟内存为2.1*1536=3225.6MB

当container的内存超出要求的,log将会打印一下信息

在 3.2 中,提到 yarn.scheduler.increment-allocation-mb 参数用于控制container内存增量,如果需要更细粒度控制container内存增量,则需要修改该参数,那么接写来分析一下这个参数如何工作的

先看下该参数在 FairSchedulerConfiguration.java 中的定义(顺带上cpu增量)

FairScheduler.java 中 initScheduler 方法中,初始化了一个 incrAllocation 对象,表明资源使用的增量

在具体 FairScheduler#allocate 方法中使用(allocate是每次资源分配过程中入口方法,在此不再赘述,有兴趣的同学自己可以下来看源码)

接下来,我们看下在 Sanity check 中发生了什么

看注释,实际上 normalizeRequests 方法对申请的资源进行了一个检查。

我们看到最终调用了 normalizeRequest 方法,再往下追,最终发现调用到 ResourceCalculator#normalize 方法,ResourceCalculator实例对象为 DominantResourceCalculator (参见allocate方法)

其中 stepFactor 对象为之前提到的 incrAllocation 对象,所以可以看出,在这里进行了一个计算资源请求的操作。

至此,这篇分析文章就要结束了,期间涉及到的一些细节并没有赘述,有兴趣的同学可以查阅源码做更深入的了解。

下篇文章,内容预告:

mapreduce on yarn简单内存分配解释

关于mapreduce程序运行在yarn上时内存的分配一直是一个让我蒙圈的事情,单独查任何一个资料都不能很好的理解透彻。于是,最近查了大量的资料,综合各种解释,终于理解到了一个比较清晰的程度,在这里将理解的东西做一个简单的记录,以备忘却。
首先,先将关于mapreduce和yarn关于内存分配的参数粘贴上:
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
yarn.nodemanager.resource.memory-mb
yarn.nodemanager.vmem-pmem-ratio
yarn.scheduler.increment-allocation-mb
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
mapreduce.map.java.opts
mapreduce.reduce.java.opts
个人认为,针对mapreduce任务,这些参数只有放在一起学习才能真正理解,如果单独考虑,理解不清晰。下面开始详细讲解。
一、理解参数yarn.nodemanager.resource.memory-mb,yarn.nodemanager.vmem-pmem-ratio
yarn.nodemanager.resource.memory-mb很简单,就是你的这台服务器节点上准备分给yarn的内存;
yarn.nodemanager.vmem-pmem-ratio网上解释都是"每使用1MB物理内存,最多可用的虚拟内存数,默认2.1",但是目前我还是不太理解其作用是什么,有知道的朋友希望能详细解释下。
二、理解参数yarn.scheduler.minimum-allocation-mb和yarn.scheduler.maximum-allocation-mb
都知道,在yarn上运行程序时每个task都是在独立的Container中运行的,单个Container可以申请的最小和最大内存的限制就是这两个参数,注意,并不是这两个参数决定单个Container申请内存的大小,而仅仅是限制的一个范围。
三、理解yarn的内存规整化因子和内存规整化算法
先不说和哪个参数有关,单纯理解这一概念。举例:
假如规整化因子b=512M,上述讲的参数yarn.scheduler.minimum-allocation-mb为1024,yarn.scheduler.maximum-allocation-mb为8096,然后我打算给单个map任务申请内存资源(mapreduce.map.memory.mb):
申请的资源为a=1000M时,实际得到的Container内存大小为1024M(小于yarn.scheduler.minimum-allocation-mb的话自动设置为yarn.scheduler.minimum-allocation-mb);
申请的资源为a=1500M时,实际得到的Container内存大小为1536M,计算公式为:ceiling(a/b)*b,即ceiling(a/b)=ceiling(1500/512)=3,3*512=1536。此处假如b=1024,则Container实际内存大小为2048M
也就是说Container实际内存大小最小为yarn.scheduler.minimum-allocation-mb值,然后增加时的最小增加量为规整化因子b,最大不超过yarn.scheduler.maximum-allocation-mb
四、理解mapreduce.map.memory.mb、mapreduce.reduce.memory.mb
"三"中提到的"打算给单个map任务申请内存资源"也就是a,其实就是指的"mapreduce.map.memory.mb"或"mapreduce.reduce.memory.mb",注意其值不要超过yarn.scheduler.maximum-allocation-mb
五、理解mapreduce.map.java.opts、mapreduce.reduce.java.opts
以map任务为例,Container其实就是在执行一个脚本文件,而脚本文件中,会执行一个 Java 的子进程,这个子进程就是真正的 Map Task,mapreduce.map.java.opts 其实就是启动 JVM 虚拟机时,传递给虚拟机的启动参数,而默认值 -Xmx200m 表示这个 Java 程序可以使用的最大堆内存数,一旦超过这个大小,JVM 就会抛出 Out of Memory 异常,并终止进程。而 mapreduce.map.memory.mb 设置的是 Container 的内存上限,这个参数由 NodeManager 读取并进行控制,当 Container 的内存大小超过了这个参数值,NodeManager 会负责 kill 掉 Container。在后面分析 yarn.nodemanager.vmem-pmem-ratio 这个参数的时候,会讲解 NodeManager 监控 Container 内存(包括虚拟内存和物理内存)及 kill 掉 Container 的过程。
也就是说,mapreduce.map.java.opts一定要小于mapreduce.map.memory.mb
mapreduce.reduce.java.opts同mapreduce.map.java.opts一样的道理。
六、理解规整化因子指的是哪个参数
"三"中提到的规整化因子也就是b,具体指的是哪个参数和yarn使用的调度器有关,一共有三种调度器:capacity scheduler(默认调度器)、fair scheduler和fifo scheduler
当使用capacity scheduler或者fifo scheduler时,规整化因子指的就是参数yarn.scheduler.minimum-allocation-mb,不能单独配置,即yarn.scheduler.increment-allocation-mb无作用;
当使用fair scheduler时,规整化因子指的是参数yarn.scheduler.increment-allocation-mb
至此,关于yarn和mapreduce的任务内存配置问题讲完了,这也是我目前理解的层次。

以上是关于Yarn下MapReduce部分参数理解的主要内容,如果未能解决你的问题,请参考以下文章

MapReduce文件配置和测试

如果我更改了 mapreduce 的配置,我应该重新启动 yarn

mapreduce on yarn简单内存分配解释

yarn和mapreduce资源调优

hive优化

设置每个datanode里面的map数目,提高运行效率