yarn框架的参数调整一般除了用于计算的资源策略要变之外,其他的除非特殊情况一般都不变的,而我们要变的时候,可以打开当前集群配置的地方找到如下的资源配置信息,加以修改,使得集群的资源使用符合当下情况,以下配置均在yarn.site.xml中

配置的时候注意一个点,所有配置不必要每个节点都一样,Hadoop本身就允许每个节点性能不同,而导致的计算资源不同


1、单个容器内存最值

yarn.scheduler.minimum-allocation-mb 
yarn.scheduler.maximum-allocation-mb

默认值1024/8192,这两个值不支持提交任务时动态更改,用来控制一个计算任务中每个被实例化的continer最大或最小可使用的内存,最大值一般不会超过,因为任务在提交给yarn调度器包装为task的时候,会先进行规划的,而小于最小临界值会按照最小值分配,这是因为yarn的配置中有一个资源使用规整化因子的角色,它不可被直接修改,但是会和最小内存保持一致,如果提交任务资源使用参数设置与此值违背则任务报错

2、单个容器核数最值

yarn.scheduler.minimum-allocation-vcores 
yarn.scheduler.maximum-allocation-vcores

默认值1/32,这两个值同样不支持提交任务时动态更改,用来控制单个容器可使用的核数最值,如果提交任务资源使用参数设置与此值违背则任务报错

3、单个节点持有的可用于计算的内存与核数资源

yarn.nodemanager.resource.memory-mb
yarn.nodemanager.resource.cpu-vcores

默认值8G/8核,但是注意yarn作为hadoop的资源调度平台,它持有的可用计算内存并不是一个总体的配置,而是我们单独对每一个节点配置的持有资源多少决定的,最后yarn会自动计算总和,并在yarn界面上显示,也就是说配置的时候对每一个节点按照性能不同单独设置这两个值就可以了

4、虚拟内存使用量

yarn.nodemanager.vmem-pmem-ratio

默认值2.1,任务每使用1MB物理内存,最多可使用虚拟内2.1MB,这个是Hadoop将内存规划之后推出的一个概念叫做虚拟内存,本质上还是用的物理内存,但是它会导致跑任务的时候,你去查看yarn页面的内存使用量,可能发生显示的使用内存,比你想象的多的后果

5、是否启用单独线程检查物理分配资源

yarn.nodemanager.pmem-check-enabled

默认值true,这个配置会启用一个线程在监控任务的运行,确保每个容器使用的就是规划好的物理内存数,如果逾越,则会kill掉任务

6、是否启用单独线程检查虚拟分配资源

yarn.nodemanager.vmem-pmem-ratio

默认值true,该配置用途同上,只是它监控的是虚拟内存


整体上其实配置集群最头痛的就是该给整个hadoop多少内存和CPU核数资源

资源给少了任务跑不动,给多了系统又会出问题,其实给资源的时候,我们要考虑的有三方,分别是hadoop集群本身、系统运行、Hbase,Hbase因为比较特殊,所以独立我们要思考这个体系

因此配置时内存我们可以参考如下表格

节点本身总内存

系统需要内存

Hbase需要内存

4GB

1GB

1GB

8GB

2GB

1GB

16GB

2GB

2GB

24GB

4GB

4GB

48GB

6GB

8GB

64GB

8GB

8GB

72GB

8GB

8GB

96GB

12GB

16GB

128GB

24GB

24GB

255GB

32GB

32GB

512GB

64GB

64GB

上面这个表格是内存的一个参考,在整体上来说,单台datanode持有的阶段初始计算内存一般不超过所在节点50%,如果有Hbase那就按照实际情况缩小一些,后续有需要在慢慢的增加,但是最大时Hadoop+Hbase总占用内存不超过所在节点的75%

说了不少内存,我们说一下核数,对于hadoop来说核数的把控是最直白的,用多少就是多少,所以在配置核数的时候没有内存那样的麻烦,因此在初始状态可以和内存一样持有所在节点的50%

最后还要考虑能够支撑一个节点上存在多少个容器,在实际应用中,会发现其实直接用hadoop子节点可用计算资源除以最小容器占用资源就可得出结果,有意思的是最小容器占用资源配置在业内称呼上叫做配置hadoop的最小因子,就是上方配置项中单容器最值的配置

配置最小因子时,前面也说了对于hadoop来说,核数是最直白的,一般核数的最小值初始状态设置 1 即可,一是因为其本身比较独立,不容易受其他因素的影响,二是由于app master默认的占用资源就是1核512m内存,而有别于核数的内存就比较耦合,最小因子的内存可以参考如下表格

当前节点可用的计算内存

最小容器内存

小于4GB

256MB

4GB到8GB之间

512MB

8GB到24GB之间

1024MB

大于24GB

2048MB


最后给大家放一个我自己本地虚拟机的例子,大家可以看看配置的格式,其中的值自己定义

<!-- yarn的集群配置 -->
        <property>
                <name>yarn.scheduler.minimum-allocation-mb </name>
                <value>512</value>
        </property>

        <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>1024</value>
        </property>

        <property>
                <name>yarn.scheduler.maximum-allocation-vcores</name>
                <value>2</value>
        </property>

        <property>
                <name>yarn.nodemanager.resource.memory-mb</name>
                <value>2048</value>
        </property>

        <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>2</value>
        </property>