EMR yarn集成Cgroup
CGroups(Control Groups)是Linux内核的一个资源隔离功能,限制/隔离/统计进程的资源使用,包括CPU/内存/磁盘IO/网络等资源。
YARN中也集成了CGroups的功能,使得NodeManger可以对container的CPU的资源使用进行控制,比如可以对单个container的CPU使用进行控制,也可以对NodeManger管理的总CPU进行控制。
1.安装cgroup
默认系统已经安装了cgroup了,如果没有安装可以通过命令安装
yum install -y libcgroup-tools ##nodemanager节点都要安装
然后通过命令启动:
systemctl start cgconfig.service
2. YARN开启CGroups功能
EMR集群中的YARN默认没有开启CGroups的功能,需要用户根据需求进行开启,下面介绍如何在EMR集群中开启CGroups。
2.1 配置YARN
添加CGroups配置
在EMR的集群配置管理页面下的YARN的yarn-site.xml中添加如下配置:
/opt/dtstack/Hadoop/hadoop_pkg/etc/hadoop/yarn-site.xml
配置名称 | 值 | 备注 |
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 | 跟/opt/dtstack/Hadoop/hadoop_pkg/etc/container-executor.cfg文件中yarn.nodemanager.linux-container-executor.group对应的值保持一致 |
yarn.nodemanager.linux-container-executor.cgroups.mount-path | /sys/fs/cgroup | 不需要加上/cpu,YARN会自动在该路径后补上/cpu,即/sys/fs/cgroup/cpu |
yarn.nodemanager.linux-container-executor.cgroups.mount | false | /sys/fs/cgroup路径下已经mount上cpu控制器,所以这地方需设置为false让YARN不去做mount操作 |
选择添加其它配置
除了上述开启CGroups功能相关的参数外,还有相关参数可以选择设置(针对非Kerberos安全集群)。
配置名称 | 值 | 备注 |
yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user | yarn | 建议不做设置,默认是nobody |
yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users | false | 设置为false,即以实际提交作业的用户跑作业,否则会使用上面local-user的固定用户来运行作业 |
在开启了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 |
备注:
1.使用 yarn.nodemanager.resource.percentage-physical-cpu-limit 来设置所有 containers 的总的 CPU 使用率占用总的 CPU 资源的百分比。所有的containers的CPU使用总和在任何情况下都不会超过机器总体CPU资源的60%。
2.使用 yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage 设置是否对 container 的 CPU 使用进行严格限制。如果设置为true,即使NodeManager的CPU资源比较空闲,containersCPU使用率也不能超过限制,可以严格限制CPU使用,保证每个container只能使用自己分配到的CPU资源;如果设置为false,container可以在有空闲CPU资源时,超额使用CPU,可以保证NodeManager总体CPU使用率比较高,提升集群的计算性能和吞吐量,所以建议使用非严格的限制方式。但是无论这个值如何设置,所有containers总的CPU使用率都不会超过cpu-limit设置的值。
yarn-site.xml(nodemanager节点都要添加)
<!-- cgroup --> <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.cgroups.hierarchy</name> <value>/hadoop-yarn</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.group</name> <value>yarn</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.nonsecure-mode.local-user</name> <value>yarn</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users</name> <value>false</value> </property> <property> <name>yarn.nodemanager.resource.percentage-physical-cpu-limit</name> <value>10</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name> <value>true</value> </property>
2.2 重启YARN
添加完上述配置后,在EMR集群配置管理下的重启YARN集群。
3.测试
3.1 总container的CPU控制测试
通过调节yarn.nodemanager.resource.percentage-physical-cpu-limit参数来控制NodeManager管理的所有container的CPU使用。
下面分别设置该值为10/30/50为例,在yarn中跑一个hadoop pi作业,观察NodeManger所在机器的cpu耗费情况。
su - yarn yarn jar /opt/dtstack/Hadoop/hadoop_pkg/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar pi 400 1000
备注
top命令中
%CPU表示进程占用单个核的比例
%Cpu(s)表示所有用户进程占总cpu的比例
10
30
50
FAQ:
处理1:
chown -R root:root /opt/dtstack/Hadoop/hadoop_pkg/etc/ chown root:root container-executor.cfg