如何启用CGroup限制YARN CPU使用率
0872-7.1.4-如何启用CGroup限制YARN CPU使用率https://mp.weixin.qq.com/s/6wARFLJWEb2rlZE6si9uug
为什么要限制yarn cpu的使用率?
cpu和core executor有什么关系 和我们说的几核几线程什么关系?
其实我理解的就是我们在spark上说的core就是几核几线程的 几线程,我们申请核的目的主要是为了计算,可以看作算力....,也就是说我们spark任务每次运行需要xxG内存,和xxcore的算力来处理任务。愚见。
node09这台服务器为16核32线程,我们在yarn里分配该机器为39.53 GB内存,32core(这里我觉得的分配的core不对,但不是重点)
测试
spark-submit --class org.apache.spark.examples.SparkPi --master yarn-client --conf spark.dynamicAllocation.enabled=false --num-executors 1 --driver-memory 512m --executor-memory 512m --executor-cores 1 spark-examples.jar 100000
注意后面的100000是为了让任务跑多点,持续的时间长好看到现象。
--spark.dynamicAllocation.enabled=false 是为了看单核的也就是占的cpu
----num-executors 1 executor-cores 1 是为了看一个core的现象
提交任务后
到node03 查看cpu情况
可以看到最开始的时候cpu占了140% 后面109 %跑到最后面稳定在90-100之间
那么这时候有个问题了,
我是num-executors 1 executor-cores 1 一台服务器上只用一个core按道理最多跑出一个核的100%的cpu,跑多了有啥影响呢?
作者原话
单个Vcore的使用率也可以超过100%,如果集群中CPU 使用率高的场景较多的情况下,因为超配的情况,就会出现即使有些作业能够分配Vcore,但是却没有实际物理cpu资源可调度,从而导致应用慢的情况。
举例。
我现在同时跑30个这种任务只申请一个core,按道理就是30G内存+30个core(假设都在这台机器),但是实际是回占用30G内存+30*1.4=42个cpu,本身是32线程,最多32个cpu,那么就会导致最多22个任务(22*14=30.8cpu)被运行,还有几个任务申请到了core和内存,但是这个core没用,因为实际的物理cpu全部被占用了
———————————————————————————————————————————
上面都是为了说明这个cpu超限制问题。
那么问题来了,怎么解决?按照作者说的,通过cgroup限制。其实这玩意就是虚拟核。
类似4核八线程,本身只有4核,但是能够模拟出8核出来,所以我们当作8核用。
这个cgroup是啥 就是把8核再虚拟下,例如虚拟2倍成16核,那么我们提交任务的时候还是
num-executors 1 executor-cores 1 ,实际上只申请了0.5核,也就是只会跑出50%的cpu
但是其中这里有个问题?我之前1核也跑出了140的cpu,这个0.5核按道理也可以跑出70的!!!
但是最后肯定是稳定在50%cpu。
同时这么做有什么好处和后果?
好处,将核更为细化,比如有的小任务就要0.5核就够了,
<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>