深圳幻海软件技术有限公司 欢迎您!

容量调度绝对值配置队列使用与避坑

2023-02-28

在yarn中,对于容量调度而言,需要配置不同的队列,并为队列分配不同的资源。然而资源的配置是按照集群总资源的百分比来的,那么,如果集群资源进行扩容,队列的资源也就相应的增加了。在某些场景下,我们可能希望某些队列的资源是固定的,不随集群资源的扩缩容而变更,这就需要给队列资源配置一个绝对值,在hadoo

在 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.
  • 3.
  • 4.

这样,配置的队列就是固定的资源了。

使用注意事项

虽然配置比较简单,使用方式和原来相比也没有什么变化,但还是有不少要注意的地方。

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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

报错信息为:

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 队列下,多个绝对值配置的队列的总资源超过了集群资源,那么该队列使用时实际能占用多少资源,具体是如何计算的等等,这就作为下篇文章的内容,我们下次再聊。