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 | false | 设置为false,即以实际提交作业的用户跑作业,否则会使用上面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
=50yarn.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
=50yarn.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)
有兴趣或者有需求的用户可以关注一下E-MapReduce的安全相关的功能,有问题及时联系和反馈。