跳转到内容

YARN容量调度器

来自代码酷

YARN容量调度器[编辑 | 编辑源代码]

YARN容量调度器(Capacity Scheduler)是Apache Hadoop YARN中的一种多租户资源调度器,专为共享、多租户集群环境设计。它通过划分集群资源为多个逻辑队列(称为“容量队列”),允许不同组织或团队按需分配资源,同时保证最低资源保障和弹性扩展能力。

核心特性[编辑 | 编辑源代码]

  • 队列层次结构:支持树形队列划分,父队列可嵌套子队列。
  • 资源隔离:每个队列分配固定比例的集群资源(如CPU、内存),避免资源抢占。
  • 弹性分配:空闲资源可被其他队列临时借用,提高利用率。
  • 多租户支持:通过ACL(访问控制列表)限制用户/组对队列的访问权限。
  • 动态配置:支持运行时修改队列属性(需管理员权限)。

工作原理[编辑 | 编辑源代码]

容量调度器通过以下机制实现资源分配:

  1. 资源请求匹配:应用向ResourceManager提交资源请求(如容器需求)。
  2. 队列选择:根据配置的队列层次和ACL规则,将请求路由到对应队列。
  3. 资源分配:按队列容量比例分配资源,优先满足有保障的容量,空闲资源可共享。

graph TD A[ResourceManager] --> B[Queue A: 40%资源] A --> C[Queue B: 60%资源] B --> D[子队列 A1: 20%] B --> E[子队列 A2: 20%] C --> F[子队列 B1: 30%] C --> G[子队列 B2: 30%]

配置示例[编辑 | 编辑源代码]

以下是一个典型的

capacity-scheduler.xml

配置片段:

<configuration>
  <!-- 定义根队列 -->
  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>prod,dev</value>
  </property>

  <!-- 生产队列分配60%资源 -->
  <property>
    <name>yarn.scheduler.capacity.root.prod.capacity</name>
    <value>60</value>
  </property>

  <!-- 开发队列分配40%资源 -->
  <property>
    <name>yarn.scheduler.capacity.root.dev.capacity</name>
    <value>40</value>
  </property>

  <!-- 允许开发队列借用空闲资源 -->
  <property>
    <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
    <value>80</value>
  </property>
</configuration>

数学建模[编辑 | 编辑源代码]

队列的资源分配满足以下约束条件:

  • 每个队列的容量 Qi 满足 Qi=100%
  • 实际资源分配 Ai 在空闲时为 min(Qi+借用资源,maximum-capacityi)

实际案例[编辑 | 编辑源代码]

场景:某公司集群同时运行生产作业(高优先级)和开发测试作业(低优先级)。

  • 解决方案:

# 创建

prod

dev

队列,分别分配70%和30%资源。 # 设置

{{{1}}}

,允许开发任务在非高峰期借用20%额外资源。 # 为

prod

队列配置ACL,仅允许生产团队提交作业。

高级功能[编辑 | 编辑源代码]

  • 资源限制:可设置队列的
    minimum-user-limit-percent
    
    防止单个用户独占资源。
  • 标签调度:将节点标记为特定类型(如GPU节点),队列可指定需要的标签。
  • 优先级调度:队列内任务可按优先级分配资源。

常见问题[编辑 | 编辑源代码]

Q: 如何防止某个队列耗尽集群资源?

A: 通过设置

maximum-capacity

限制队列的最大资源占比,例如:

<property>
  <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
  <value>50</value>
</property>

Q: 如何动态更新队列配置? A: 使用YARN命令(需刷新队列):

yarn rmadmin -refreshQueues

最佳实践[编辑 | 编辑源代码]

  • 为关键业务设置独立的队列,并分配有保障的容量。
  • 监控队列资源使用率,定期调整容量分配。
  • 对测试环境队列设置较低的
    maximum-capacity
    
    ,避免影响生产。