概述
yarn.scheduler.capacity.resource-calculator:该配置指定调度器使用的资源计算器,资源计算器用于在调度器中比较资源。默认值是 org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator,只使用内存进行比较,而DominantResourceCalculator 用 Dominant-resource比较多维度资源,如内存,CPU等等。
在文章 《Capacity Scheduler 中 user-limit-factor 参数的理解》的最后,我们提到了集群资源的限制是完全基于内存,而没有使用vCore。原因就是容量调度器默认的资源计算器是 DefaultResourseCalculator,那么如果使用另一种DominantResourceCalculator 资源计算器,能否使资源的限制同时基于内存和CPU这2个维度呢?
验证
我们通过实际测试来验证,将该参数改为DominantResourceCalculator,如下:
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>
修改该参数需要重启RM才能生效。
队列的资源配置如下:
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>1.0</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>20.0</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
<value>5.0</value>
</property>
集群资源情况如下:
然后提交测试任务
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.3.1.0.17-1.jar\
teragen\
-Dmapred.map.tasks=1000 100000000000 /benchmarks/terasort-input
按照配置,user-limit-facto 为5.0 ,也就是任务最多能使用队列资源的5倍,也就是大约250GB的内存和30个vCore.
查看集群资源使用情况
可以看做,vCore的限制终于生效了。内存只用了64GB,vCore使用32个(其中包括了AM使用的2个vCore),由于vCore的限制使得无法继续使用更多资源了。
然后继续调整 user-limit-facto 为50
<property>
<name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
<value>50.0</value>
</property>
刷新队列后,查看资源使用情况
由于最大资源的限制,作业只用了244G的内存;队列最大123个vCore用了122个,剩余1个vCore没使用,是因为每个container最少需要2个vcore
结论
至此我们就解决了文章 《Capacity Scheduler 中 user-limit-factor 参数的理解》最后提出的疑问,是因为Capacity Scheduler 的资源计算器使用的是默认的DefaultResourseCalculator。