0. 前言
CGroups(Control Groups)是 Linux 内核的一个资源隔离功能, 限制 / 隔离 / 统计进程的资源使用, 包括 CPU / 内存 / 磁盘 IO / 网络等资源
YARN 中也集成了 CGroups 的功能, 使得 NodeManger 可以对 container 的 CPU 的资源使用进行控制, 比如可以对单个 container 的 CPU 使用进行控制, 也可以对 NodeManger 管理的总 CPU 进行控制
1. YARN 开启 CGroups 功能
E-MapReduce 集群中的 YARN 默认没有开启 CGroups 的功能, 需要用户根据需求进行开启, 下面介绍如何在 E-MapReduce 集群中开启 CGroups
1.1 umount cgroups cpu
E-MapReduce 集群使用的是 Centos7 的操作系统, 默认 CGroups 的 cpu 和 cpuacct 两个子系统控制器 (SubSystem Controller) 合并到一起, mount 的路径在
/sys/fs/cgroup/cpu,cpuacct
由于 NodeManger 在 launch container 的时候, 有个 CGroups 路径逻辑会以逗号进行解析分隔, 所以会造成
/sys/fs/cgroup/cpu,cpuacct
被错误的解析出 / sys/fs/cgroup/cpu, 从而导致 container 启动失败所以需要避免 cpu 控制器的 mount 路径出现逗号, 我们需要将默认的 mount 路径 umount 掉, 然后后续可以交给 NodeManger 去自动 mount 到另外一个可配置的路径
集群上所有节点执行
- #umount 原来默认路径
- umount /sys/fs/cgroup/cpu,cpuacct
- # 创建新的 cpu 控制器 mount 路径
- mkdir -p /cgroup/cpu
1.2 配置 YARN
可参考官方文档 Using CGroups with YARN
添加 CGroups 配置
在 E-MapReduce 的集群配置管理页面下的 YARN 的 yarn-site 中添加如下配置:
配置名称 | 值 | 备注 |
---|---|---|
yarn.nodemanager.container-executor.class | org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor | 无 |
yarn.nodemanager.linux-container-executor.resources-handler.class | org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler | 无 |
yarn.nodemanager.linux-container-executor.group | hadoop | 跟 / etc/ecm/hadoop-conf/container-executor.cfg 文件中 yarn.nodemanager.linux-container-executor.group 对应的值保持一致 |
yarn.nodemanager.linux-container-executor.cgroups.mount-path | /cgroup | 1.1 节中新建的 CGroups 路径,不需要加上 / cpu,YARN 会自动在该路径后补上 / cpu,即 / cgroup/cpu |
yarn.nodemanager.linux-container-executor.cgroups.mount | true | 1.1 节 umount 原来的路径后,只是新建了一个新路径 / cgroup/cpu,并未 mount 上 cpu 控制器,所以这地方需设置为 true 让 YARN 去做 mount 操作 |
选择添加其它配置
除了上述开启 CGroups 功能相关的参数外, 还有相关参数可以选择设置(
针对非 Kerberos 安全集群
)
配置名称 | 值 | 备注 |
---|---|---|
yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user | 建议不做设置,默认是 nobody | |
yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users | true | 设置为 true,即以实际提交作业的用户跑作业,否则会使用上面 local-user 的固定用户来运行作业 |
1.3 重启 YARN
添加完上述配置后, 在 E-MapReduce 集群配置管理下的重启 YARN 集群
2. YARN 中 CGroups 对 CPU 控制测试
2.1 控制参数
在开启了 CGroups 功能的前提下, 可以通过调节 YARN 中的参数来控制 CPU 的资源使用行为:
配置名称 | 描述 |
---|---|
yarn.nodemanager.resource.percentage-physical-cpu-limit | NodeManager 管理的所有 container 使用 CPU 的硬性比例,默认 100% |
yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage | 对 container 的 CPU 使用资源是否严格按照被分配的比例进行控制,即使 CPU 还有空闲。默认是 false,即 container 可以使用空闲 CPU |
备注:
任何场景下, NodeManger 管理的 container 的 CPU 都不能超过
yarn.nodemanager.resource.percentage - physical - cpu - limit
比例
2.2 测试
2.2.1 总 container 的 CPU 控制测试
通过调节 yarn.nodemanager.resource.percentage-physical-cpu-limit 参数来控制 NodeManager 管理的所有 container 的 CPU 使用
下面分别设置该值为 10/30/50 为例, 在 yarn 中跑一个 hadoop pi 作业, 观察 NodeManger 所在机器的 cpu 耗费情况
集群配置为 3 台 4 核 16GB, 其中 2 台 NodeManger,1 台 ResourceManager
备注
top 命令中
%CPU 表示进程占用单个核的比例
%Cpu(s)表示所有用户进程占总 cpu 的比例
10
如上图所示:
%Cpu(s)接近 10%
%CPU 所有的 test 用户的 container 进程加起来(7% 5.3% 5% 4.7% 4.7% 4.3% 4.3% 4% 2%=41.3%=0.413 个核, 约等于 10%*4core, 即 4 个核的 10% 比例)
30
如上图所示:
%Cpu(s)接近 30%
%CPU 所有的 test 用户的 container 进程加起来(19% 18.3% 18.3% 17% 16.7% 16.3% 14.7% 12%=132.3%=1.323 个核, 约等于 30%*4core=1.2 核, 即 4 个核的 30% 比例)
50
如上图所示:
%Cpu(s)接近 50%
%CPU 所有的 test 用户的 container 进程加起来(65.1% 60.1% 43.5% 20.3% 3.7% 2%=194.7%=1.947 个核, 约等于 50%*4core=2 核, 即 4 个核的 50% 比例)
2.2.2 container 间的 CPU 控制测试
NodeManger 上面启动多个 container, 所有这些 container 对 CPU 资源的占用不超过 2.2.1 中设置
yarn.nodemanager.resource.percentage - physical - cpu - limit
的硬性比例上限
在硬性上限前提下, NodeManger 有两种方式来管理控制多个 container 之间的 CPU 使用率, 这两种方式通过参数
yarn.nodemanager.linux - container - executor.cgroups.strict - resource - usage
来进行控制
共享模式(share)
当
yarn.nodemanager.linux - container - executor.cgroups.strict - resource - usage
设置为 false 时即为共享模式(默认为 false)
在这种模式下, container 除了实际被需要分配的 CPU 资源外, 还可以利用空闲的 CPU 资源
例如如果一个 container 的 vcore 为 1,NodeManger 配置的 vcore 为 8,
yarn.nodemanager.resource.percentage - physical - cpu - limit
设置为 50%,NodeManger 所在节点是 4core, 那么该 container 申请按比例被分配的 cpu 资源为(1vcore/8vcore)(4core50%)=0.25core, 但是如果 CPU 有空闲, 理论上该 container 可以占满 NodeManger 管理的上限(4core*50%=2core)
以上述 2.2.1 节中 hadoop pi 为例:
- yarn.nodemanager.resource.percentage - physical - cpu - limit
- =50
- yarn.nodemanager.linux - container - executor.cgroups.strict - resource - usage
- =false
上图可以看出, test 用户的多个 container 进程占用 CPU 核数的比例相差很大(65%=0.65core 60.1%=0.61core 3.7%=0.37core 等), 即单个 container 的 CPU 使用没有被严格限制在(1vcore/8vcore)(4core50%)=0.25core
严格模式(strict)
当
yarn.nodemanager.linux - container - executor.cgroups.strict - resource - usage
设置为 true 时即为严格模式
在这种模式下, container 只能使用被需要分配的 CPU 资源, 即使 CPU 有空闲也不能使用
以上述共享模式同样参数作业为例, 只是将该参数改为 true:
- yarn.nodemanager.resource.percentage - physical - cpu - limit
- =50
- yarn.nodemanager.linux - container - executor.cgroups.strict - resource - usage
- =true
如上图所示, test 账号下的每个 container 占用的 CPU 核数均在 0.25core 附近(26.6%=0.266core 24.9%=0.249core), 而 0.25core 即为该 container 实际应该被分配的 CPU((1vcore/8vcore)(4core50%)=0.25core)
来源: https://yq.aliyun.com/articles/446778