Hadoop YARN CGroup 实践

文章目录

    • Hadoop YARN Cgroups 实践
      • 什么是 cgroups
      • cgroups 概念
      • YARN 使用 cgroups 背景
      • cgroups 在 YARN 中的工作原理
      • cgroups 在 YARN 中的实践步骤
      • 参考

Hadoop YARN Cgroups 实践

什么是 cgroups

cgroups 的全名叫做 Control Groups, 它是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、网络、磁盘IO等)。

cgroups 主要提供有以下四个功能:

  • Resource Limiting: Group 可以设定 CPU、内存等使用上限;

  • Prioritization: 不同的 Group 可以拥有不同的 CPU 跟 磁盘IO 使用优先顺序

  • Accounting: 计算 Group 内的资源使用状况,例如可以拿来当作计费的依据

  • Control:冻结或是重启一整个 Group 的 Process

cgroups 概念

了解 cgroups 的一些基本核心概念,cgroups 主要由四个元素构成:

  • Task: 运行于作业系统内的 Process,在 cgroups 内被称为 Task;

  • Subsystem: 一种资源控制器,一个 Subsystem 负责管理一种资源,例如 CPU 或是 Memory,不同的作业系统所提供的 Subsystem 种类可能不尽相同,以下列出一些常见的类型:

    在这里插入图片描述

    • blkio:限制 Task 对于储存装置的读取,例如 Disk, SSD 和 USB…等
    • cpu: 透过 Scheduler 安排 cgroup 内 Task 存取 CPU 资源
    • cpuacct: 自动产生 cgroup 内的 Task 使用 CPU 资源的报告
    • cpuset: 为 cgroup 内的 Task 分配一组单独的 CPU 核心 (多核心 的 CPU 系统) 跟 Memory
    • devices: 控制 cgroup 中 Task 可以存取的装置有哪些
    • freezer: 暂停跟恢复位于 cgroup 内的 Task
    • memory: 限制 Task 可以使用的 Memory,并且自动产生 cgroup 内 Task 使用 Memory 资源的报告
    • net_cls: 对网路封包标记上 Class ID,进而让 Linux Traffic Controller 根据这些 Class ID 得知网路封包是来自于哪一个 cgroup 中的 Task
    • net_prio: 为每一个 Network Interface 提供动态设定网路流量优先权的方法
    • perf_event: 用来辨别 Task 属于哪一个 cgroup
  • cgroup: cgroups 的资源控制单位,也就是 Task 与 Subsystem 的关联单位,用来定义 Task 的资源管理策略,例如把一个 Task 加入到某个 cgroup 内,那么这个 Task 使用资源时就必须遵守该 cgroup 中所定义的规范;

  • hierarchy: 一群 cgroup 所组成的树状结构,每个节点都是一个 cgroup,一个 cgroup 可以有多个子节点,子节点预设继承父节点的属性;系统中可以有多个 hierarchy;

YARN 使用 cgroups 背景

cgroups 是用于限制一组进程的资源使用(如 CPU、内存、网络、磁盘IO)。Apache YARN 利用此功能为 Hadoop 工作负载提供 CPU 隔离。目前,YARN 仅支持通过 cgroup 限制 CPU 使用率。

我们生产环境是 YARN 和 Presto 混合部署,如果 YARN 上运行并大量消耗 CPU 资源任务,就会发生与Presto 争抢 CPU 资源。Cgroups 可以限制 node manager 上的所有 YARN containers CPU 使用。

cgroups 在 YARN 中的工作原理

YARN 资源分配背后的基本概念是 container。container 是最小的资源分配单元*,*对内存和 vcore 具有固定的资源限制。这提供了限制 container 内运行的任务(进程)的内存和 vcore 资源的能力。当 node manager 无法为container 提供足够的资源时,任务将无法启动。类似地,cgroups 监控 node manager 上所有 container 的 CPU 使用情况,并在达到限制时停止向容器分配 CPU 时间。此时,任务进程进入等待状态,一直持续到有足够的资源为止。主要工作过程如下:

  • 用户定义允许 node manager 使用多少 CPU 时间(以百分比表示,通过YARN 参数 yarn.nodemanager.resource.percentage-physical-cpu-limit 控制);
  • 当用户提交作业时,Application Master计算每个任务需要的处理器数量(container 请求的 vcore 数量),然后向 resource manager 提交请求;
  • resource manager 将 container 分配给能够提供所需资源的适当节点;
  • node manager 计算每个 container 的 CPU 使用限制(百分比值)并将该值写入 cgroups 配置文件;
  • node manager 启动 container 来完成任务;
  • Linux 内核保证每个 container 在 CPU 限制内运行。

cgroups 在 YARN 中的实践步骤

准备工作

  • 重新编译container-executor
# LinuxContainerExecutor通过container-executor来启动容器,但是出于安全的考虑,要求其所依赖的配置文件container-executor.cfg及其各级父路径所有者必须是root用户;编译目的是修改 container-executor.cfg 配置文件的存放路径。

cd /home/admin/hadoop-3.1.1-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager
cmake src -DHADOOP_CONF_DIR=/etc/hadoop
# cmake 版本需要安装 3.1版本以上的,本次使用cmake-3.27.7
  • 修改container-executor.cfg
yarn.nodemanager.linux-container-executor.group=admin
banned.users=
min.user.id=0
allowed.system.users=

修改 YARN 配置

# 修改 yarn-site.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.resources-handler.class</name>
        <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value>
    </property>
    <property>
        <name>yarn.nodemanager.linux-container-executor.group</name>
        <value>admin</value>
    </property>
    <property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name>
        <value>/sys/fs/cgroup</value>
    </property>
    <property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user</name>
        <value>admin</value>
    </property>

    <property>
        <name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
        <value>true</value>
    </property>
    
    <property>
        <name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
        <value>2.0</value>
    </property>
    
    <property>
        <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
        <value>true</value>
    </property>
    
    <property>
        <name>yarn.nodemanager.resource.percentage-physical-cpu-limit</name>
        <value>85</value>
    </property> 
    
# yarn.nodemanager.resource.count-logical-processors-as-cores 默认是false,是使用物理核心数当做vcore数;修改为true表示使用逻辑核心数据

# yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage 设置为true时即为严格模式,container只能使用被需要分配的CPU资源,即使CPU有空闲也不能使用;设置为false时即为非严格模式,container除了实际被需要分配的CPU资源外,还可以利用空闲的CPU资源。

拷贝 container-executor.cfg 到 /etc/hadoop

sudo mkdir -p /etc/hadoop
sudo cp /home/admin/container-executor.cfg /etc/hadoop/

创建 cgroup 目录

sudo yum install -y libcgroup-tools
cd /sys/fs/cgroup/cpu
sudo cgcreate -t admin:admin -a admin:admin -g cpu:/hadoop-yarn

# sudo cgdelete cpu:/hadoop-yarn
# mount -t cgroup -o cpu,cpuacct cpu /sys/fs/cgroup/cpu

注意:无论使用 cgcreate 还是mkdir 创建 cgroup目录,都是临时的,服务器重启后都会消失。

替换 NM container-executor

cp -r /home/admin/container-executor /opt/apache/hadoop/bin/
sudo chown root:admin /opt/apache/hadoop/bin/container-executor
sudo chmod 6050 /opt/apache/hadoop/bin/container-executor

优雅重启 NM

# 查看 NM日志出现 "restricted to 34.0 cores",40逻辑核心数 * 85% cpu-limit = 34 cores
INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.CGroupsCpuResourceHandlerImpl: YARN containers restricted to 34.0 cores

验证

第一批10台节点
未开启 YARN cgroups前,cpu-limit 为85%,cpu 使用率超过85%情况较多,甚至可以到100%;
开启 YARN cgroups 后,cpu 使用率超过85%情况较之前好转, 未出现超过100%。

在这里插入图片描述
在这里插入图片描述

参考

Hadoop YARN 配置
Hadoop YARN CGroups

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/275838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

技术资讯:2023编程语言排行榜,出炉啦!

大家好&#xff0c;我是大澈&#xff01; 本文约2000字&#xff0c;整篇阅读大约需要4分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

深信服AF防火墙配置SSL VPN

防火墙版本&#xff1a;8.0.85 需提前确认防火墙是是否有SSL VPN的授权&#xff0c;确认授权用户数量 1、确认内外网接口划分 2、网络→SSL VPN&#xff0c;选择内外网接口地址 3、SSL VPN→用户管理→新增一个SSL VPN的用户 4、新增L3VPN资源&#xff0c;类型选择Other&…

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)

为结构体自身时&#xff0c;用.调用成员变量&#xff1b;为结构体指针时&#xff0c;用->调用成员变量 所以存在结构体数组时&#xff0c;调用数组元素里的成员变量&#xff0c;就是要用. 结构体自身只有在new时才会创建出来&#xff0c;而其指针可以随意创建 在用new时&…

听GPT 讲Rust源代码--src/tools(28)

File: rust/src/tools/clippy/clippy_lints/src/operators/identity_op.rs 文件路径 rust/src/tools/clippy/clippy_lints/src/operators/identity_op.rs 中的作用是定义了 IdentityOp 类型的 Clippy lint 规则&#xff0c;用于检查代码中是否存在不必要的恒等操作符&#xff0…

Tiny Object Detection

文章目录 RFLA: Gaussian Receptive Field based Label Assignment for Tiny Object Detection&#xff08;ECCV2022&#xff09;Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection&#xff08;CVPR2023&#xff09;TOD-CMLNN&#xff08;2023&#xff09; …

为什么LED显示屏显示会有色差?

在LED显示屏的销售过程中&#xff0c;由于尾货来自不同批次的产品&#xff0c;其亮度差异不可避免&#xff0c;导致拼装后的显示效果不佳。为解决这一问题&#xff0c;逐点校正技术应运而生。逐点校正技术是一项用于提升LED电子屏亮度均匀性和色彩保真度的技术。通过对LED显示屏…

深度学习核心技术与实践之深度学习基础篇

非书中全部内容&#xff0c;只是写了些自认为有收获的部分 神经网络 生物神经元的特点 &#xff08;1&#xff09;人体各种神经元本身的构成很相似 &#xff08;2&#xff09;早期的大脑损伤&#xff0c;其功能可能是以其他部位的神经元来代替实现的 &#xff08;3&#x…

C# 常用数据类型及取值范围

1.常见数据类型和取值范围 序号数据类型占字节数取值范围1byte10 到 2552sbyte1-128 到 1273short 2-32,768 到 32,7674ushort20 到 65,5355int4-2,147,483,648 到 2,147,483,6476uint40 到 4,294,967,2957float41.5 x 10−45 至 3.4 x 10388double85.0 10−324 到 1.…

[玩转AIGC]LLaMA2训练自己的中文故事撰写神器(content generation)

目录 一、下载并加载中文数据集二、中文数据集处理1、数据格式2、数据集处理之tokenizer训练格式1&#xff09;先将一篇篇文本拼凑到一起&#xff08;只是简单的拼凑一起&#xff0c;用于训练tokenizer&#xff09;2&#xff09;将数据集进行合并 3、数据集处理之模型&#xff…

关于设计模式、Java基础面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法&#xff1f; 细分起来就有9种&#xff1a;懒汉&#x…

程序员的三大美德

Perl 语言的发明人 Larry Wall 一个经典叙述&#xff1a;优秀程序员应该有三大美德&#xff1a;懒惰、急躁和傲慢&#xff08;Laziness, Impatience and hubris&#xff09;。 有人甚至为此专门打造了一个三大美德的网站&#xff0c;阐释这个初看起来匪夷所思的说法。 懒惰&am…

ES6的一些高级技巧

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

作业--day38

1.定义一个Person类&#xff0c;包含私有成员&#xff0c;int *age&#xff0c;string &name&#xff0c;一个Stu类&#xff0c;包含私有成员double *score&#xff0c;Person p1&#xff0c;写出Person类和Stu类的特殊成员函数&#xff0c;并写一个Stu的show函数&#xff…

【AI+MJ提示词】Midjourney提示词系统化-反乌托邦(Dystopian)和技术朋克

反乌托邦&#xff08;Dystopian&#xff09;和技术朋克 反乌托邦&#xff08;Dystopian&#xff09;和技术朋克&#xff08;Techno Punk&#xff09;都是描述未来世界的文学流派。 反乌托邦描述的未来世界通常是一个被政府或强大机构严格控制的世界&#xff0c;人们的生活被监…

SuperMap iClient3D for WebGL实现浮动点效果

文章目录 前言一、update方法二、创建实体点三、效果 前言 基于SuperMap iClient3D for WebGL实现浮动点效果&#xff0c;原理就是不断改变实体的高度&#xff0c;这里我们选择使用CallbackProperty来实现。 一、update方法 var cc 0 var dd truevar update function() {i…

【网络安全 | 扫描器】御剑安装及使用教程详析

御剑是一款传统的Web网络安全综合检测程序&#xff0c;支持对PHP、JSP、ASPX等文件进行扫描&#xff0c;具备全扫描、网络安全扫描和主机安全扫描能力&#xff0c;方便发现网站漏洞。 文章目录 下载使用教程 本文对御剑的安装及使用教程进行详析 下载 下载地址读者可自行上网…

【C++进阶03】二叉搜索树

一、二叉搜索树的概念和性质 中序遍历二叉搜索树会得到一个有序序列 所以二叉搜索树又称二叉排序树 它可以是一棵空树 也可以是具有以下性质的二叉树&#xff1a; 若它的左子树不为空 则左子树上所有节点的值都小于根节点的值若它的右子树不为空 则右子树上所有节点的值都大于…

新能源汽车与计算机技术:共创智能出行新时代

新能源汽车与计算机技术&#xff1a;共创智能出行新时代 一、引言 新能源汽车以其环保、节能的特性逐渐成为未来出行的趋势&#xff0c;而计算机技术的融入则为新能源汽车带来了前所未有的变革。从电池管理到自动驾驶&#xff0c;再到车联网&#xff0c;计算机技术在新能源汽…

【10】ES6:Promise 对象

一、同步和异步 1、JS 是单线程语言 JavaScript 是一门单线程的语言&#xff0c;因此同一个时间只能做一件事情&#xff0c;这意味着所有任务都需要排队&#xff0c;前一个任务执行完&#xff0c;才会执行下一个任务。但是&#xff0c;如果前一个任务的执行时间很长&#xff…

【JavaEE】多线程(6) -- 定时器的使用及实现

目录 定时器是什么 标准库中的定时器的使用 实现定时器 定时器是什么 Java中的定时器是一种机制&#xff0c;用于在预定时间执行某个任务。它允许开发人员在指定的时间间隔内重复执行任务&#xff0c;或在指定的延迟之后执行任务。定时器是Java提供的一种方便的工具&#xf…