Hadoop YARN Cgroups 资源隔离讲解

一、概述

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 环境准备

可以选择物理部署,如果只是测试的话,也可以选择容器部署,这里为了快速测试就选择容器部署了。物理部署和容器部署教程如下:

三、内存资源限制

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 短时间分配大量内存,会导致内存限制策略失效,进而引发内存问题。

弹性模式的配置如下:

xml 复制代码
<!-- 关闭严格模式 -->
<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...

前期准备工作:

bash 复制代码
###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 里面配置的一致。

xml 复制代码
<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.

xml 复制代码
<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 用户有写入权限即可。

xml 复制代码
<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>

提前创建目录

bash 复制代码
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 资源。

bash 复制代码
<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 资源隔离讲解就先到这里了,有任何疑问也可关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~

相关推荐
成长之路5141 小时前
【实证分析】数智化转型对制造企业全要素生产率的影响及机制探究(1999-2023年)
大数据
黑眼圈的小熊猫1 小时前
Git开发
大数据·git·elasticsearch
涛思数据(TDengine)1 小时前
虚拟表、TDgpt、JDBC 异步写入…TDengine 3.3.6.0 版本 8 大升级亮点
大数据·数据库·tdengine
goTsHgo2 小时前
Flink的 RecordWriter 数据通道 详解
大数据·flink
Romantic Rose3 小时前
你所拨打的电话是空号?手机状态查询API
大数据·人工智能
随缘而动,随遇而安4 小时前
第四十六篇 人力资源管理数据仓库架构设计与高阶实践
大数据·数据库·数据仓库·sql·数据库架构
小宋10214 小时前
Linux安装Elasticsearch详细教程
大数据·elasticsearch·搜索引擎
程序员老周6665 小时前
数据仓库标准库模型架构相关概念浅讲
大数据·数据仓库·hive·数仓·拉链抽取·增量抽取·数据仓库架构
Made in Program7 小时前
从数据格式转换的角度 flink cdc 如何写入paimon?
大数据·flink·paimon
jzy37117 小时前
Hive疑难杂症全攻克:从分隔符配置到权限避坑实战指南
大数据·apache hive