hadoop3.x yarn内存、CPU配置

说明

yarn 中的 内存、cpu 核心数量,有些是虚拟的,与 物理内存、物理cpu无关

内存

yarn.nodemanager.resource.memory-mb

注意:不要超过物理内存

<!-- nodemanager使用内存数,默认值是 -1,表示 8192(MB),不要超过物理内存 -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>20480</value>
</property>

yarn web中查看:

集群中某个节点分配给 yarn 的 nodemanager 的最大可用内存,这个最大可用内存不是该节点最大内存,而是该节点最大内存划分出来的给nodemanager使用的内存

比如:一个节点最大内存为 128G ,计划给nodemanager 80% 的内存资源,则设置 yarn.nodemanager.resource.memory-mb103G ,其余 25G 用作该节点其他资源调配,保证这个计算节点正常运行。
这个配置默认是 8G,集群并不会主动检测这个可用内存,如果节点内存资源少于 8G ,需要将这个配置项设置成实际的资源

注意:如果不配置,集群会按照 8G 的资源调配,这样会导致可能同时创建过多的container而OOM。

与物理内存的关系

NodeManager的可用内存 和 物理内存没有直接关系

这里可以配置 大于 物理内存,如:物理内存是 8G,这里配置 20G,启动 yarn 后,也可以在 上图中 看到 确实生效了

与公平调度器的关系

链接

yarn.nodemanager.vmem-pmem-ratio

虚拟内存的比例,默认是2.1,即每使用 1G 物理内存,分配 2.1 的虚拟内存。

虚拟内存不够也会报oom,在nodemanager的日志中可以看到。

<!-- 虚拟内存和物理内存设置比例,默认2.1,这里配置为4 -->
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value>
</property>

yarn.scheduler.minimum-allocation-mb

提示:一般不需要改动

<!-- 每个容器可以申请最小内存,默认1024 -->
<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
</property>

这个配置时用来指定单个容器(container)可申请的最小内存资源,默认1024

如果申请的内存资源小于这个配置项的值,则按最小值分配。(有的商业版禁止申请小于这个值的内存资源)

这个配置是会影响到单个节点上container个数的,所以比较重要。有下面的经验推荐值:

Total RAM per Node    Recommended Minimum Container Size
Less than 4 GB    256 MB
Between 4 GB and 8 GB    512 MB
Between 8 GB and 24 GB    1024 MB
Above 24 GB    2048 MB

yarn.scheduler.maximum-allocation-mb

<!-- 每个容器可以申请最大内存,默认8192 -->
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>8192</value>
</property>

单个容器(container)可申请的最大内存资源,应用在运行时申请的内存不能超过这个配置项值,
因为这个配置项是指定一个container最大的内存,实际分配内存时并不是按照这个配置项分配,所以这个配置项可以配置成和nodemanager的可用内存(yarn.nodemanager.resource.memory-mb)一样即可,这样的话,意味着只要这个节点的nodemanager可用内存哪怕只够跑一个container,这个container也是可以启动的。
如果这个参数配置的比nodemanager的可用内存(yarn.nodemanager.resource.memory-mb)小,那么可能出现这个节点总内存即使足够提供所需内存的,但却无法启动container的情况。

mapreduce.map.memory.mb

指定map任务时申请的内存,是一个精确值,不是范围值,这就是一个map真实用到内存的值了。
这个配置是可以在脚本或代码中动态申请的,但是取值范围必须是在container内存大小值之间。
即:

yarn.scheduler.minimum-allocation-mb 小于 mapreduce.map.memory.mb 小于 yarn.scheduler.maximum-allocation-mb

比如在hive中申请:set mapreduce.map.memory.mb=4096;
实际上,我们现在大部分脚本在执行前都是动态申请一下的。只要在container大小以内。

yarn.nodemanager.pmem-check-enabled

防止执行程序报错

<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是 true -->
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>

yarn.nodemanager.vmem-check-enabled

<!-- 是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property> 
    <name>yarn.nodemanager.vmem-check-enabled</name> 
    <value>false</value> 
</property>

要关闭,否则执行任务时可能报错,详见 链接

cpu

yarn.nodemanager.resource.cpu-vcores

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

指定这个NodeManager节点上总共可分配的vcore数,默认为8个,要根据实际情况调整

yarn.scheduler.minimum-allocation-vcores

<property>
    <name>yarn.scheduler.minimum-allocation-vcores</name>
    <value>1</value>
</property>

该参数指定一个Container最少需要的vcore数,默认为1个

yarn.scheduler.maximum-allocation-vcores

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

该参数指定一个Container最多可以分配的vcore数,默认为4个

参考:
https://blog.csdn.net/longlovefilm/article/details/116890470
https://www.jianshu.com/p/87fe2730fcac


原文出处:https://malaoshi.top/show_1IX4A8wxEuBu.html