很多朋友在刚开始搭建和使用 YARN 集群的时候,很容易就被纷繁复杂的配置参数搞晕了:参数名称相近、新老命名掺杂、文档说明模糊 。特别是那几个关于内存的配置参数,即使看好几遍文档也不能完全弄懂含义不说,配置时一不小心就会张冠李戴,犯错误。
如果你同样遇到了上面的问题,没有关系,在这篇文章中,我就为大家梳理一下 YARN 的几个不易理解的内存配置参数,并结合源码阐述它们的作用和原理,让大家彻底清楚这些参数的含义。
一、YARN 的基本架构
介绍 YARN 框架的介绍文章网上随处都可以找到,我这里就不做详细阐述了。之前我的文章“YARN环境中应用程序JAR包冲突问题的分析及解决”中也对 YARN 的一些知识点做了总结,大家可以在TheFortyTwo 后台回复编号 0x0002 获得这篇文章的推送。下面附上一张 YARN 框架图,方便引入我们的后续内容:
图 1: YARN 架构图
二、内存相关参数梳理
YARN 中关于内存配置的参数呢,乍一看有很多,其实主要也就是那么几个(如果你感觉实际接触到的比这更多更混乱,是因为大部分的配置参数都有新命名和旧命名,我后面会分别解释),我已经整理出来列在了下表中。大家先看一下,对于表中各列的意义,我会在本节后面详细说明;而对于每个参数的意义,我会放在下节进行详细解释。
图 2: 内存参数整理图
下面我们解释一下表中的各列:
配置对象:指参数是针对何种组件起作用;
参数名称:这个不用解释,大家都明白;
旧参数名称:大家都知道,MapReduce 在大版本上,经历了 MR1 和 MR on YARN;而小版本则迭代了不计其数次。版本的演进过程中,开发人员发现很多参数的命名不够标准,就对参数名称做了修改;但是为了保证程序的前后兼容,仍然保留了旧参数名称的功能。这样等于是实现同一个功能的参数,就有了新旧两种不同的名称。比如 mapreduce.map.java.opts 和 mapred.map.child.java.opts 两个参数,其实是等价的。那如果新旧两个参数都设置了情况下,哪个参数会实际生效呢&#