YARN 容量调度器队列配置与多租户资源隔离

优化 YARN 容量调度器配置实现多业务队列的资源公平分配与物理隔离,覆盖队列规划、Node Labels 和抢占策略

袋鼠云
袋鼠云
央国企集团 生产制造分析

多业务共享大数据集群时,容量调度器(Capacity Scheduler)通过队列层级实现资源的保证分配与弹性共享。关键在于合理设置队列的 Capacity(保证容量)、Max Capacity(上限容量)、抢占策略和 Node Labels,使不同业务线在互不干扰的前提下最大化集群利用率。

队列规划:从组织架构到资源拓扑

队列规划应从组织架构和业务特征出发。典型的多租户集群将队列分为三层:root 队列下设置部门级子队列(如 data_team、analytics、ml_team),部门队列下再设环境级队列(如 data_team.prod、data_team.dev)。

容量分配原则:每个父队列的子队列容量之和必须等于 100%。例如 data_team 队列分配 40% 集群资源,其下 prod 子队列占 80%、dev 子队列占 20%,则 data_team.prod 占集群总容量的 32%,data_team.dev 占 8%。

<property>
  <name>yarn.scheduler.capacity.root.queues</name>
  <value>data_team,analytics,ml_team</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.data_team.capacity</name>
  <value>40</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.data_team.maximum-capacity</name>
  <value>60</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.data_team.queues</name>
  <value>prod,dev</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.data_team.prod.capacity</name>
  <value>80</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.data_team.dev.capacity</name>
  <value>20</value>
</property>

Max Capacity 的弹性控制:maximum-capacity 限制队列在集群空闲时最多能使用的资源比例。例如 data_team 的 Max Capacity 设为 60%,即使集群空闲,该队列也不能超过 60%,为其他队列保留最低 40% 的可用资源。这是防止大业务线挤占小业务线资源的关键参数。

大数据基础平台 EasyMR

统一存储、计算与运维,支撑批、流、OLAP 与湖仓一体的国产化大数据底座平台

了解产品

关键参数的场景化配置

user-limit-factor

控制单个用户在队列内能使用的资源比例。默认值为 1,表示单个用户最多使用队列的 100% 保证容量。在共享开发队列中建议设为 0.5,防止单个开发者的 Spark 作业独占整个队列:

<property>
  <name>yarn.scheduler.capacity.root.data_team.dev.user-limit-factor</name>
  <value>0.5</value>
</property>

在专用生产队列中设为更大的值(如 2 或不限制),允许单个作业使用队列保证容量加弹性容量。

maximum-application-queues

限制每个队列同时运行的 Application 数量。默认无限制。在开发队列中建议设置上限(如 20),防止大量小作业堆积导致 ResourceManager 压力:

<property>
  <name>yarn.scheduler.capacity.root.data_team.dev.maximum-applications</name>
  <value>20</value>
</property>

minimum-user-limit-percent

当队列资源紧张时,确保每个用户至少能获得队列容量的指定百分比。默认为 0(不保证)。在多用户共享队列中设为 25,确保至少 4 个用户能同时获得资源:

<property>
  <name>yarn.scheduler.capacity.root.data_team.dev.minimum-user-limit-percent</name>
  <value>25</value>
</property>

resource-calculator

默认的 DefaultResourceCalculator 仅按内存分配资源。对于 CPU 密集型作业,应切换为 DominantResourceCalculator,按内存和 CPU 的主导资源比例分配:

<property>
  <name>yarn.scheduler.capacity.resource-calculator</name>
  <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>

抢占策略(Preemption)

当某队列资源使用量低于其保证容量,而其他队列超量使用时,容量调度器可以抢占超量队列的 Container,将资源归还给被挤压的队列。

启用抢占:

<property>
  <name>yarn.scheduler.capacity.root.preemption.enable</name>
  <value>true</value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.preemption.max-able-to-kill-per-cycle</name>
  <value>1.0</value>
</property>

抢占的权衡:抢占会导致被抢占的应用任务中断和重新执行。生产环境中需要设置 maximum-concurrent-preemption 限制同时被抢占的 Container 数量,并设置 cross-queue-preemption.enable 控制是否允许跨队列抢占。

建议的生产策略:开发环境队列开启抢占,确保开发作业不被生产作业饿死;生产队列之间不开启跨队列抢占,避免生产作业相互影响。通过 maximum-capacity 控制弹性上限,在资源充裕时自然借用空闲资源,在资源紧张时自动释放。

央国企集团

围绕集团穿透式管控、业财融合、风险防控与数据资产管理,支撑总部看清全局、穿透下级、管住风险、盘活资产。

了解解决方案

Node Labels 实现物理隔离

Node Labels 允许将集群节点打上标签(如 gpu、highmem、ssd),并通过队列的 node-label-expression 将队列的作业调度到特定标签的节点上。

配置 Node Labels:

<property>
  <name>yarn.node-labels.enabled</name>
  <value>true</value>
</property>
<property>
<name>yarn.node-labels.fs-store.root-dir</name>
  <value>hdfs:///yarn/node-labels</value>
</property>

队列绑定 Node Label:为机器学习队列绑定 gpu 标签,确保 GPU 资源仅被 ML 作业使用:

<property>
  <name>yarn.scheduler.capacity.root.ml_team.node-label-expression</name>
  <value>gpu</value>
</property>

容量分配与 Node Label 的配合:在使用 Node Label 时,队列的 Capacity 可以设置为仅针对特定标签节点的百分比。例如 ML 队列分配 GPU 标签节点的 70%,同时在全局节点上分配 10%,确保 ML 作业既能优先使用 GPU 节点,又能在需要时借用通用节点。

运维注意:修改队列配置后无需重启 ResourceManager,通过 yarn rmadmin -refreshQueues 命令即可生效。但 Node Label 的变更需要在 ResourceManager 重启后才能完全生效。队列一旦创建不可删除,只能修改容量或将其 capacity 设为 0 来停用。

开启Data+AI 之旅

填写表单,获取专属解决方案

400-002-1024

工作日 9:00-18:00

关注公众号

获取最新产品动态与技术干货

关注公众号

企业微信

扫码添加企业微信