一、概述

Hadoop YARN (Yet Another Resource Negotiator) 运用 Cgroups(Control Groups)来进行资源办理和阻隔。Cgroups 是 Linux 内核提供的一种机制,用于约束、账户和阻隔进程组(process groups)的资源(例如 CPU、内存、磁盘 I/O 等)。

以下是 Hadoop YARN Cgroups 的首要解说:

  1. 资源阻隔和办理: Cgroups 答应将进程组织成层次结构,每个层次结构都能够分配特定的资源配额。在 Hadoop YARN 中,每个应用程序或容器都能够被放置在一个独立的 Cgroup 中,以确保资源阻隔和办理。
  2. 支撑的资源: YARN Cgroups 首要用于约束和办理以下资源:
    • CPU: 约束每个容器能够运用的 CPU 资源。
    • 内存: 约束每个容器能够运用的内存资源。
    • 磁盘 I/O: 约束每个容器能够运用的磁盘 I/O 资源。
  3. Cgroups 装备: 在 YARN 中,Cgroups 的装备信息一般在 yarn-site.xml 文件中指定。装备项包括:
    • yarn.nodemanager.linux-container-executor.cgroups.hierarchy: Cgroups 层次结构的称号。
    • yarn.nodemanager.linux-container-executor.cgroups.mount: 是否挂载 Cgroups。
  4. Cgroups 的运用场景:
    • 资源阻隔: Cgroups 答应将使命或容器阻隔在一个独立的环境中,防止它们互相搅扰。
    • 资源配额: 能够为每个使命或容器设置资源配额,防止其运用过多的 CPU、内存等资源。
    • 使命优先级: 经过调整 Cgroups 中的资源约束,能够为不同的使命分配不同的优先级。
  5. YARN 中的 Cgroups 完成: YARN 运用 Linux Container Executor(LCE)来完成容器的阻隔和资源办理。LCE 负责为每个容器创建 Cgroup 并进行资源的装备。
  6. 留意事项和装备主张:
    • 装备 Cgroups 时需求确保体系启用了 Cgroups 功用,且相应的内核模块已加载。
    • 能够依据实践需求装备 Cgroups 的层次结构和资源约束。

官方文档:hadoop.apache.org/docs/curren…

Hadoop YARN Cgroups 资源阻隔解说

二、Hadoop 环境准备

能够挑选物理布置,假如仅仅测验的话,也能够挑选容器布置,这儿为了快速测验就挑选容器布置了。物理布置和容器布置教程如下:

三、内存资源约束

Hadoop 3.x 里 YARN 的内存约束战略有三种:

  • 无约束:无约束形式不会约束 container 内存的运用,该形式下集群的资源利用率高。可是遇到一些不太守规矩的用户,会呈现请求很少内存可是占用许多的作业,这种作业会严峻影响到集群的稳定性,假如没有继续运营,会导致集群在某些阶段面对很严峻的稳定性危险。

  • 严厉约束:严厉形式会约束进程实践运用的内存,并将实践运用内存超越请求内存的作业杀掉。在 Java 的核算使命中,其实存在很多非堆内存运用,很难在作业提交前预测出作业实践的内存占用情况。因而严厉形式会导致许多使命呈现 OOM 被 kill 的情况,对于平台方来说会有比较高的 oncall 本钱,对用户需求了解底层的一些细节,并且不断调整作业的内存装备。优点也比较显着,整个集群作业的资源运用收到严厉约束,作业和作业时刻的阻隔相对比较完全,因而整个集群的稳定性有非常好的保障。严厉形式下有两种完成方法:

    • 根据 poll 形式, NodeManager 内部会有一个 MonitorThread 守时检查每个 container 的内存运用(rss)是否超越了请求的内存,并将超越内存的 container 杀掉,在 ResourceManager 中能看到 Task 被 kill 的原因。这个战略有个小问题是检测有间隔,假如一个 container 短时刻内很多请求内存,还是会有一点危险。另外一个问题就是,这个战略无法约束 CPU 的运用。
    • 另外一种就是根据 Linux 的 CGroups 机制去约束每个 Container 的内存运用。CGroups 也是 Docker 约束进程资源的中心机制,不过在 YARN 中,是由 NodeManager 来完成 CGroups 战略的创建和毁掉。Cgroups 的机制相比 MonitorThread 比,凭借了操作体系原生的资源阻隔机制,能够一起支撑 CPU 和内存、网络的约束。

整个严厉形式的通病就是:假如内存约束太严厉,会导致使命容易挂掉,会有很多的沟通本钱;CPU 约束太严厉,使命的核算功用欠安,一起集群的资源利用率会低。

  • 弹性内存操控:弹性形式的首要思路是将 NodeManager 和他办理的 container 看作一个全体,经过 CGroups 进行阻隔。答应某些 container 运用超越自己请求的资源,一起假如全体资源超越了阈值,就发动严厉的约束战略进行驱赶。

【留意】Hadoop 2.x 时还不支撑 CGroup,内存约束首要根据 poll 的线程来约束,假如遇到 NodeManager 短时刻分配很多内存,会导致内存约束战略失效,进而引发内存问题。

弹性形式的装备如下:

<!-- 关闭严厉形式 -->
<property>
  <name>yarn.nodemanager.resource.memory.enforced</name>
  <value>false</value>
</property>
<!-- 敞开 CGroup 内存资源约束 -->
<property>
  <name>yarn.nodemanager.resource.memory.enabled</name>
  <value>true</value>
</property>
<!-- 弹性内存 -->
<property>
  <name>yarn.nodemanager.elastic-memory-control.enabled</name>
  <value>true</value>
</property>
<!-- 敞开物理内存检查 -->
<property>
  <name>yarn.nodemanager.pmem-check-enabled</name>
  <value>true</value>
</property>
<!--cancel check of physical and virtural memory allocation-->
<property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
</property>
<!-- Using Cgroup -->
<property>
  <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name>
  <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value>
</property>
<!-- CPU 资源约束 -->
<property>
  <name>yarn.nodemanager.resource.percentage-physical-cpu-limit</name>
  <value>90</value>
</property>

可是内存一般经过设置yarn.nodemanager.resource.memory-mb 参数即可操控NM节点的内存运用上限。首要是CPU的约束,接下来就细讲CPU资源约束。

四、CPU 资源约束

CGroups 是一种将使命及其子使命聚集和区分进一个垂直的分组的战略,并提供在此结构上的特别的操作。CGroups 是 Linux 内核功用,自内核版别 2.6.24 被引进。从 Yarn 角度,该功用使得限额容器的资源运用成为可能。一个示例是 CPU 运用,假如没有 CGroups,约束容器的 CPU 运用非常困难。

官方文档:hadoop.apache.org/docs/curren…

前期准备工作:

###1、 分配可执行文件权限
chown root:hadoop /opt/apache/hadoop/bin/container-executor
# 该装备文件权限特别,得设置6050权限
chmod 6050 /opt/apache/hadoop/bin/container-executor
### 2、装备 container-executor.cfg
vi  /opt/apache/hadoop/etc/hadoop/container-executor.cfg
yarn.nodemanager.local-dirs=/hadoop/yarn/local
yarn.nodemanager.log-dirs=/hadoop/yarn/log
yarn.nodemanager.linux-container-executor.group=hadoop 
banned.users=hdfs,yarn,mapred,bin
min.user.id=1000

1)启用 LCE

Nodemanager 中, CGroup 功用集成在 LinuxContainerExecutor 中,所以要运用 CGroup 功用,有必要设置 container-executorLinuxContainerExecutor. 一起需求装备 NM 的 Unix Group,这个是可执行的二进制文件 container-executor 用来做安全验证的,需求与 container-executor.cfg 里边装备的一致。

<property>
  <name>yarn.nodemanager.container-executor.class</name>
  <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor<value>
</property>
<property>
  <name>yarn.nodemanager.linux-container-executor.group</name>
  <value>hadoop<value>
</property>

2)启用 CGroup

LinuxContainerExecutor 并不会强制敞开 CGroup 功用, 假如想要敞开 CGroup 功用,有必要设置 resource-handler-classCGroupsLCEResourceHandler.

<property>
  <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name>
  <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler<value>
</property>

3)装备 Yarn CGroup 目录

NM 经过 yarn.nodemanager.linux-container-executor.cgroups.hierarchy 装备一切 Yarn Containers 进程放置的 CGroup 目录。

  • 假如体系的 CGroup 未挂载和装备,能够在体系上手动挂载和装备和启用 CGroup 功用,也能够经过设置 yarn.nodemanager.linux-container-executor.cgroups.mounttrue,一起设置 CGroup 挂载路径 yarn.nodemanager.linux-container-executor.cgroups.mount-path 来完成 NM 自动挂载 CGroup (不主张这样用,问题挺多)。

  • 假如体系的 CGroup 现已挂载且装备完成,并且 Yarn 用户有 CGroup cpu 子目录的写入权限,NM 会在 cpu 目录下创建 hadoop-yarn 目录 ,假如该目录现已存在,确保 yarn 用户有写入权限即可。

<property>
  <name>yarn.nodemanager.linux-container-executor.cgroups.hierarchy</name>
  <value>/hadoop-yarn<value>
</property>
<property>
  <name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>
  <value>false<value>
</property>
<property>
  <name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name>
  <value>/sys/fs/cgroup<value>
</property>

提前创建目录

mkdir /sys/fs/cgroup/hadoop-yarn
# 需求给hadoop用户有执行权限即可
chown -R hadoop:haodop /sys/fs/cgroup/hadoop-yarn

3)CPU 资源约束

NM 首要运用两个参数来约束 containers CPU 资源运用。

  • 首先,运用 yarn.nodemanager.resource.percentage-physical-cpu-limit 来设置一切 containers 的总的 CPU 运用率占用总的 CPU 资源的百分比。比方设置为 60,则一切的 containers 的 CPU 运用总和在任何情况下都不会超越机器总体 CPU 资源的 60 %。

  • 然后,运用 yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage 设置是否对 containerCPU 运用进行严厉约束。

    • 假如设置为 true ,即使 NMCPU 资源比较闲暇, containers CPU 运用率也不能超越约束,这种装备下,能够严厉约束 CPU 运用,确保每个 container 只能运用自己分配到的 CPU 资源。
    • 可是假如设置为 falsecontainer 能够在 NM 有闲暇 CPU 资源时,超量运用 CPU,这种形式下,能够确保 NM 总体 CPU 运用率比较高,提高集群的核算功用和吞吐量,所以主张运用非严厉的约束方法(实践经过 CGroupcpu share 功用完成)。不管这个值怎样设置,一切 containers 总的 CPU 运用率都不会超越 cpu-limit 设置的值。
  • NM 会依照机器总的 CPU num* limit-percent 来核算 NM 总体可用的实践 CPU 资源,然后依据 NM 装备的 Vcore 数量来核算每个 Vcore 对应的实践 CPU 资源,再乘以 container 请求的 Vcore 数量核算 container 的实践可用的 CPU 资源。这儿需求留意的是,在核算总体可用的 CPU 核数时,NM 默认运用的实践的物理核数,而一个物理核一般会对应多个逻辑核(单核多线程),并且我们默认的 CPU 核数一般都是逻辑核,所以我们需求设置 yarn.nodemanager.resource.count-logical-processors-as-corestrue 来指定运用逻辑核来核算 CPU 资源。

<property>
  <name>yarn.nodemanager.resource.percentage-physical-cpu-limit</name>
  <value>80<value>
</property>
<property>
  <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name>
  <value>false<value>
</property>    
<property>
  <name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
  <value>true<value>
</property>

【留意】Linux 内核版别 3.10.0-327.el7.x86_64 上 Yarn 启用 CGroup 功用后,会触发内核 BUG,导致内核卡死,重启,NM 挂掉,一切运行的使命失利。所以假如需求启用 CGroup 功用,肯定不能运用 3.10.0-327.el7.x86_64 版别内核。亲测晋级内核版别可解决该问题。

假如不知道怎样晋级体系内核,能够参阅我这篇文章:Centos7 内核晋级(5.4.225)


Hadoop YARN Cgroups 资源阻隔解说就先到这儿了,有任何疑问也可重视我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,费事帮助一键三连(点赞、转发、收藏)~

Hadoop YARN Cgroups 资源阻隔解说