在 yarn 中,对于容量调度而言,需要配置不同的队列,并为队列分配不同的资源。然而资源的配置是按照集群总资源的百分比来的,那么,如果集群资源进行扩容,队列的资源也就相应的增加了。在某些场景下, 我们可能希望某些队列的资源是固定的,不随集群资源的扩缩容而变更,这就需要给队列资源配置一个绝对值,在 hadoop3.1.0 版本中,开始引入了这个功能。本文就来聊聊如何给队列配置绝对值资源,以及一些使用过程中的注意事项。
配置使用
配置绝对值资源的队列其实很简单,在原来配置百分比的地方,修改为资源的绝对值即可。例如:
<property>
<name>yarn.scheduler.capacity.root.bigdata.capacity</name>
<value>[vcores=60,memory=614400,yarn.io/gpu=0]</value>
</property>
这样,配置的队列就是固定的资源了。
使用注意事项
虽然配置比较简单,使用方式和原来相比也没有什么变化,但还是有不少要注意的地方。
1. 根队列下,队列可创建的模式
在根队列("/")下,可以同时创建类型为百分比、绝对值的子队列。
2. 根队列下,队列的容量问题
在根队列下,如果同时创建了百分比、绝对值方式的队列,那么对于百分比队列而言,累加的百分比可以大于 100%,但单个队列的百分比值不能超过 100%
同样对于绝对值方式的队列,所有队列的资源总和同样可以大于集群的总资源,但是,如果根队列下只有百分比的队列,那么队列累加的百分比之和还是和之前一样,必须等于 100,对于绝对值的队列,也是一样的,非根队列下的子队列,其资源的总和可以大于等于父队列的资源,但不能超过父队列的资源。
3. 子队列的模式
前面说了根队列下的队列可以同时创建百分比、绝对值方式的队列,而在非根队列下的队列,其类型就必须与父队列保持一致,即如果父队列是百分比的,那么子队列也只能是百分比;如果父队列是按绝对值方式配置的,子队列也只能以绝对值的方式进行配置,否则会报类型不匹配的错误,导致队列刷新失败或 rm 启动失败,例如采用如下配置更新队列:
<property>
<name>yarn.scheduler.capacity.root.cloudstorage.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.cloudstorage.queues</name>
<value>ceph</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.cloudstorage.ceph.capacity</name>
<value>[vcores=60,memory=614400,yarn.io/gpu=0]</value>
</property>
报错信息为:
4. 绝对值队列下创建资源为 0 的子队列类型问题
动态新增的某个队列不需要了, 这个时候会将队列的资源配置为 0,并将队列的状态配置为 STOPPED,以停用该队列。
然而由于在绝对值模式的队列下,创建的子队列也只能是以绝对值的方式配置,如果此时将子队列的值设置为 0 后,刷新队列会报队列的类型与父队列不匹配的错误。
即配置方式为 [vcores=0,memory=0,yarn.io/gpu=0] 的队列,其类型认为是百分比的模式,父队列如果是绝对值模式的, 那么确实就出现了不匹配的报错。
该问题实际上是一个 bug,正确的方式是:配置为 0 资源的队列其类型与父队列相同。社区有对应的记录,在未来的 3.4.0 中修复。具体可参考 YARN-10364
5. 通过 yarnClient 获取队里有效资源不正确
通过 yarnclient 的 getEffectiveMinCapacity 获取的值与 UI 界面展示的值不相符,同样这个也是源码中的 BUG。赋值的时候搞错了。
注意,当前这个问题仅在 trunk 分支上修复。
以上这些就是使用过程中常见的需要注意的点,除此之外,还有几个小的点,使用的场景也有限,这里简单罗列下,如有需要可详细参考社区的 jira 单。
(1) 绝对值配置的队列,maxApplications 的值被覆盖
https://issues.apache.org/jira/browse/YARN-10396
(2) 第三级队列资源计算错误问题
https://issues.apache.org/jira/browse/YARN-8917
总结
文章就总结到这里了,看完之后是否还记得应该如何给队列配置绝对值资源,以及使用中有哪些需要注意的地方。此外,是否也还留有一些疑惑的地方,比如 root 队列下,多个绝对值配置的队列的总资源超过了集群资源,那么该队列使用时实际能占用多少资源,具体是如何计算的等等,这就作为下篇文章的内容,我们下次再聊。