服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Hadoop YARN Cgroups 资源隔离讲解,你学会了吗?

Hadoop YARN Cgroups 资源隔离讲解,你学会了吗?

2023-12-26 17:08未知服务器之家 Linux

一、概述 Hadoop YARN (Yet Another Resource Negotiator)使用Cgroups(Control Groups)来进行资源管理和隔离。Cgroups是 Linux 内核提供的一种机制,用于限制、账户和隔离进程组(process groups)的资源(例如 CPU、内存、磁盘 I/O 等)。 以下是Hadoop

一、概述

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 资源。

  1. Cgroups 配置:在YARN中,Cgroups的配置信息通常在yarn-site.xml文件中指定。配置项包括:
  • yarn.nodemanager.linux-container-executor.cgroups.hierarchy: Cgroups 层次结构的名称。

  • yarn.nodemanager.linux-container-executor.cgroups.mount: 是否挂载 Cgroups。

  1. Cgroups的使用场景:

  • 资源隔离:Cgroups允许将任务或容器隔离在一个独立的环境中,防止它们互相干扰。

  • 资源配额: 可以为每个任务或容器设置资源配额,防止其使用过多的 CPU、内存等资源。

  • 任务优先级: 通过调整Cgroups中的资源限制,可以为不同的任务分配不同的优先级。

  1. YARN中的Cgroups实现:YARN使用Linux Container Executor(LCE)来实现容器的隔离和资源管理。LCE负责为每个容器创建Cgroup并进行资源的配置。

  2. 注意事项和配置建议:

  • 配置Cgroups时需要确保系统启用了Cgroups功能,且相应的内核模块已加载。

  • 可以根据实际需求配置Cgroups的层次结构和资源限制。

官方文档:https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeManagerCgroups.html

Hadoop YARN Cgroups 资源隔离讲解,你学会了吗?图片

二、Hadoop 环境准备

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

  • 大数据Hadoop原理介绍+安装+实战操作(HDFS+YARN+MapReduce)
  • 大数据Hadoop之——数据仓库Hive
  • 大数据Hadoop之——计算引擎Spark
  • 通过 docker-compose 快速部署 Hive 详细教程

三、内存资源限制

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 使用非常困难。

官方文档:https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeManagerCgroups.html

前期准备工作:

###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-executor为LinuxContainerExecutor. 同时需要配置 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-class为CGroupsLCEResourceHandler.

<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.mount为true,同时设置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设置是否对container的CPU使用进行严格限制。

如果设置为true,即便NM的CPU资源比较空闲,containers CPU使用率也不能超过限制,这种配置下,可以严格限制 CPU 使用,保证每个container只能使用自己分配到的CPU资源。

但是如果设置为false,container可以在NM有空闲CPU资源时,超额使用CPU,这种模式下,可以保证NM总体CPU使用率比较高,提升集群的计算性能和吞吐量,所以建议使用非严格的限制方式(实际通过CGroup的cpu 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-cores为true来指定使用逻辑核来计算 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版本内核。亲测升级内核版本可解决该问题。

延伸 · 阅读

精彩推荐
  • LinuxLinux系统下无法卸载挂载的目录怎么办?

    Linux系统下无法卸载挂载的目录怎么办?

    我们在日常运维中经常性会遇到需要进行磁盘的扩容、卸载、挂载等操作,但是有时候这个系统上跑的应用并没有停止或者有其他的运维同事在操作这个目...

    今日头条10302020-12-30
  • Linuxlinux设置tomcat自启动的方法

    linux设置tomcat自启动的方法

    这篇文章主要介绍了linux设置tomcat自启动的方法,需要的朋友可以参考下...

    Linux教程网8512021-10-10
  • Linux理解 Linux/Unix 登录脚本的技巧

    理解 Linux/Unix 登录脚本的技巧

    有一些常见的情况,例如从Debian的包管理程序到Iaas的管理中,很多任务需要设置环境变量才能正常运行。 有时,程序通常只需要在 登陆时运行一次,例如...

    未知1042023-05-12
  • Linux将 Linux 终端与 Nautilus 文件管理器结合起来

    将 Linux 终端与 Nautilus 文件管理器结合起来

    Nautilus 是 GNOME 桌面环境中的图形化文件浏览器。你可以使用它来访问和管理系统中的文件和文件夹。 尽管并非所有人都喜欢使用终端来管理文件和目录,...

    未知812023-08-08
  • Linuxssh 登录很慢该如何解决

    ssh 登录很慢该如何解决

    这篇文章主要介绍了ssh 登录很慢该如何解决的相关资料,这里提供了两种方法,DNS反向解析及关闭ssh的gssapi认证的解决办法,需要的朋友可以参考下...

    linuxeye9922021-12-16
  • Linuxlinux top命令详解

    linux top命令详解

    这篇文章主要介绍了linux top命令详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    sparkdev5622022-03-01
  • Linux在Linux系统中创建新的亚马逊AWS访问密钥的方法

    在Linux系统中创建新的亚马逊AWS访问密钥的方法

    如何在Linux系统中创建新的亚马逊AWS访问密钥?我在配置一个需要访问我的亚马逊AWS帐号的应用时被要求提供AWS访问密钥ID和秘密访问密钥,我怎样创建一个...

    Linux教程网6182019-10-30
  • Linuxlinux驱动程序开发详细介绍

    linux驱动程序开发详细介绍

    前提,一般来说内核代码的错误可能会引起一个用户进程的死亡,或者整个系统的瘫痪,更严重的后果,可能导致磁盘损伤~因此建议最好有一台实验机进行...

    Linux教程网5392019-12-17