“梦想感到一股清凉,在夏日黄昏”
环境说明
集群测试环境:CDH6.2.1
Linux系统:centos7.6 内存15G 物理核数2个(逻辑核4个)
未启用CGroup时验证
1.1前置准备
前置条件1:spark.dynamicAllocation.enabled=false,取消动态资源分配并更新到客户端配置,避免应用程序分配过多的CPU,影响判断。
前置条件2:YARN 配置 :yarn.nodemanager.resource.cpu-vcores
RM UI页面验证结果 总vcore为6 已和物理cpu个数比例 1:1
测试程序:使用spark pi 程序测试仅启用1个Vcore用于查看CPU使用率(后续的验证也都使用该用例)
spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-client \
--num-executors 1 \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1 \ /opt/cloudera/parcels/CDH/jars/spark-examples_2.11-2.4.0-cdh6.2.1.jar 10000
1.2 场景一测试
CGroup未启用,虚拟核跟物理核分配分配为1:1(这也是常用的配置),提交spark 作业后,
在Spark History Server 界面上找到该Application > 查看Executors > Active 的Executor
cm116 节点 确认Vcore 分配为1。
确认Vcore数为1 和 executor 所在机器
到该节点执行 如下命令:
#查找该程序的进程 ps -ef | grep application_1658928582683_0002 #使用top -p 命令查看进程ID的CPU使用率 top -p 52896
cm116机器top截图 第一行即为cpu使用情况
结论:确认在未启用CGroup的情况下单个Vcore的使用率可以超过100%。
1.3 场景二测试
Cgroup 未启用,虚拟核分配分配为物理核2.5倍 即yarn.nodemanager.resource.cpu-vcores配置为5(当集群要求并发高时可以超配Vcore的数量实现更多的并发)
设置完成重启服务生效 已显示15个vcore
运行上面的Spark程序 查看UI页面 确认机器和vcore
#查找该程序的进程 ps -ef | grep application_1623411625770_0974 #使用top -p 命令查看进程ID的使用率 top -p 18484
结论:单个Vcore的使用率也可以超过100%,如果集群中CPU 使用率高的场景较多的情况下,因为超配的情况,就会出现即使有些作业能够分配Vcore,但是却没有实际物理cpu资源可调度,从而导致应用慢的情况。
启用CGroup 时验证
1.1 Yarn启用CGroup
打开CM yarn配置选择搜索:
1、yarn.nodemanager.linux-container-executor.resources-handler.class
2、yarn.nodemanager.container-executor.class
3、yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage
4、在YARN服务> 配置> yarn-site.xml YARN服务高级参数配置代码段(安全阀)
<property>
<name>yarn.nodemanager.resource.count-logical-processors-as-cores</name> <value>true</value>
<description>是否将虚拟核当cpu 核心数</description>
</property>
<property> <name>yarn.nodemanager.resource.detect-hardware-capabilities</name> <value>true</value>
<description>YARN 自动探测CPU和内存</description>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>-1</value>
<description>关闭虚拟vcore配置,如物理机有启用超线程不关闭该参数无法读取到超线程核数</description>
</property>
<property> <name>yarn.nodemanager.resource.pcores-vcores-multiplier</name> <value>2.5</value>
<description>物理核与vcore的配比倍数</description>
</property>
5、打开CM首页->Hosts->Hosts Configuration
搜索Enable Cgroup-based Resource Management
6、重启集群此时cgroup已启用
1.2 验证
1、开始运行spark pi 程序程序测试
查看任务ui页面
查看进程任务
如上图所示,运行的应用程序cgroups目录默认在/var/lib/yarn-ce/cgroups/cpu/hadoop-yarn 目录下
查看CPU使用率
top -e 进程ID 结果展示CPU使用率稳定在40&左右
在2.5倍Vcore的配置下,CPU使用率一直在40%左右,符合期望值。
如果启用CGroup限制成功那么理论值应该在40%,理论CPU最大使用率= 物理core数量/ Vcore数量*100%
比如我集群的物理core数量是2核,配置的Vcore数量是2.5倍。一台机器的总vcore为5个, 那么每个Vcore的CPU最大使用率是 2/5*100%=40%,如果配置的Vcore数量是2倍,那么那么每个Vcore的CPU最大使用率是 2/4*100%=50%.
总结
启用CGroup对CPU的最大使用率进行限制,可以使作业性能可预测(比如预估Spark Streaming 作业中每个executor的Vcore可以处理数据量的大小)。在分配同样的cpu下,如果不设置严格CPU使用率限制,则CPU密集型作业在集群未大量使用时运行得更快(例如所表现的情况是同样CPU资源分配下,Spark Streaming 作业中每个executor的Vcore可以处理数据量的大),但在集群中运行更多作业时运行速度较慢(可能的风险是例如同样CPU资源分配下Spark Streaming 作业中每个executor的Vcore可以处理数据量的小,导致数据堆积从而导致应用失败)。