上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

Hadoop YARN Cgroups 资源隔离讲解

guduadmin31天前

文章目录

    • 一、概述
    • 二、Hadoop 环境准备
    • 三、内存资源限制
    • 四、CPU 资源限制
      • 1)启用 LCE
      • 2)启用 CGroup
      • 3)配置 Yarn CGroup 目录
      • 3)CPU 资源限制

        一、概述

        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 资源。
          • Cgroups 配置:

            在 YARN 中,Cgroups 的配置信息通常在 yarn-site.xml 文件中指定。配置项包括:

            • yarn.nodemanager.linux-container-executor.cgroups.hierarchy: Cgroups 层次结构的名称。
            • yarn.nodemanager.linux-container-executor.cgroups.mount: 是否挂载 Cgroups。
            • Cgroups 的使用场景:
              • 资源隔离: Cgroups 允许将任务或容器隔离在一个独立的环境中,防止它们互相干扰。
              • 资源配额: 可以为每个任务或容器设置资源配额,防止其使用过多的 CPU、内存等资源。
              • 任务优先级: 通过调整 Cgroups 中的资源限制,可以为不同的任务分配不同的优先级。
              • YARN 中的 Cgroups 实现:

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

              • 注意事项和配置建议:
                • 配置 Cgroups 时需要确保系统启用了 Cgroups 功能,且相应的内核模块已加载。
                • 可以根据实际需求配置 Cgroups 的层次结构和资源限制。

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

        Hadoop YARN Cgroups 资源隔离讲解,在这里插入图片描述,第1张

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

                弹性模式的配置如下:

                
                
                  yarn.nodemanager.resource.memory.enforced
                  false
                
                
                
                  yarn.nodemanager.resource.memory.enabled
                  true
                
                
                
                  yarn.nodemanager.elastic-memory-control.enabled
                  true
                
                
                
                  yarn.nodemanager.pmem-check-enabled
                  true
                
                
                
                  yarn.nodemanager.vmem-check-enabled
                  false
                
                
                
                  yarn.nodemanager.linux-container-executor.resources-handler.class
                  org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler
                
                
                
                  yarn.nodemanager.resource.percentage-physical-cpu-limit
                  90
                
                

                但是内存一般通过设置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 里面配置的一致。

                
                  yarn.nodemanager.container-executor.class
                  org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor
                
                
                  yarn.nodemanager.linux-container-executor.group
                  hadoop
                
                

                2)启用 CGroup

                LinuxContainerExecutor 并不会强制开启 CGroup 功能, 如果想要开启 CGroup 功能,必须设置 resource-handler-class 为 CGroupsLCEResourceHandler.

                
                  yarn.nodemanager.linux-container-executor.resources-handler.class
                  org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler
                
                

                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 用户有写入权限即可。

                  
                    yarn.nodemanager.linux-container-executor.cgroups.hierarchy
                    /hadoop-yarn
                  
                  
                    yarn.nodemanager.linux-container-executor.cgroups.mount
                    false
                  
                  
                    yarn.nodemanager.linux-container-executor.cgroups.mount-path
                    /sys/fs/cgroup
                  
                  

                  提前创建目录

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

                      
                        yarn.nodemanager.resource.percentage-physical-cpu-limit
                        80
                      
                      
                        yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage
                        false
                          
                      
                        yarn.nodemanager.resource.count-logical-processors-as-cores
                        true
                      
                      

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

网友评论

搜索
最新文章
热门文章
热门标签