YARN 中自带了哪几种常见的资源调度器(Scheduler)?
在 Apache Hadoop YARN 中,自带了 三种 最常见的资源调度器(Scheduler)。它们主要用于解决在有限的集群资源下,如何合理地为多个应用程序(如 MapReduce、Spark、Flink 任务)分配资源的问题。
这三种调度器分别是:FIFO Scheduler(先进先出调度器)、Capacity Scheduler(容量调度器) 和 Fair Scheduler(公平调度器)。
以下是它们的详细介绍和对比:
1. FIFO Scheduler(先进先出调度器)
这是 YARN 中最基础、最简单的调度器。
- 工作原理:将所有的应用程序放在一个单一的队列中,按照任务提交的时间顺序(先进先出)来分配资源。只有当排在前面的任务执行完毕(或者前面任务所需的资源已经满足),才会给下一个任务分配资源。
- 优点:
- 逻辑简单,极易理解。
- 不需要复杂的配置。
- 调度器本身的系统开销极小。
- 缺点:
- 极不适合多租户/共享集群。
- 大任务阻塞小任务:如果队列头部是一个需要消耗大量资源且运行时间极长的“大任务”,后面的“小任务”即使只需要很少的资源,也必须死等,导致系统响应时间极差。
- 适用场景:个人开发测试环境,或者非常单纯的单任务批处理环境。在生产环境中几乎不使用。
2. Capacity Scheduler(容量调度器)
这是 Apache Hadoop 默认 的资源调度器(由 Yahoo 贡献),专门为多租户共享集群设计。
- 工作原理:
- 多队列:支持将集群资源划分成多个层级队列(如
root.sales,root.engineering)。 - 容量保证:每个队列都可以配置一个“基础资源容量”(Capacity,按百分比配置),保证该队列最少能获得这些资源。
- 弹性共享:如果某个队列的资源有剩余(空闲),调度器允许其他资源紧张的队列“借用”这些空闲资源,从而提高整个集群的资源利用率。
- 队列内部默认采用 FIFO 策略(也可配置为 Fair 策略)。
- 多队列:支持将集群资源划分成多个层级队列(如
- 优点:
- 资源利用率高:通过弹性借用机制,不会让资源闲置。
- 安全与隔离:通过严格的容量配置和访问控制,保证多部门/多租户之间的资源不被完全挤占。
- 缺点:
- 配置相对复杂。
- 如果一个队列借用了其他队列的资源,当资源所有者需要资源时,可能需要等待借用者释放资源(或者配置抢占机制强行终止借用者的任务,这会造成一定的资源浪费)。
- 适用场景:适合多部门共享的大型生产集群,特别是对各部门资源占比有明确规划的场景。
3. Fair Scheduler(公平调度器)
这是由 Facebook 贡献的调度器,目的也是为了解决多租户共享集群的问题,但侧重点不同。
- 工作原理:
- 动态公平:它的核心理念是让所有正在运行的应用在时间尺度上“公平”地获得相等的资源份额。
- 无需排队等待:如果集群中只有一个任务在跑,它可以使用 100% 的资源。当第二个任务提交时,调度器会动态地将一半的资源分配给第二个任务(通过等待旧任务释放 Container 或资源抢占实现)。
- 同样支持多队列,并可以为不同的队列或应用设置“权重(Weight)”,权重越高的队列分到的资源比例越大。
- 优点:
- 小任务响应快:非常适合混合工作负载(长耗时的批处理任务 + 短耗时的交互式查询)。短任务提交后能迅速获得资源开始执行,无需等待大任务结束。
- 资源分配极其动态和灵活。
- 缺点:
- 调度逻辑最复杂,调度器本身的计算开销相对较大。
- 在极端情况下,资源被切分得过于零碎,可能导致所有任务都在缓慢运行(不过可以通过配置最小资源量来避免)。
- 适用场景:混合工作负载的生产集群,特别是交互式查询(如 Hive、Impala、Spark SQL)较多,要求快速响应的场景。(注:它曾是 CDH 发行版的默认调度器)。
总结与现状补充
| 调度器 | 核心特点 | 队列结构 | 资源分配方式 | 生产环境推荐度 |
|---|---|---|---|---|
| FIFO | 先到先得,大任务易阻塞 | 单队列 | 独占式顺序分配 | ❌ 不推荐 (仅测试) |
| Capacity | 容量保证,弹性借用 | 多队列层级 | 按配置比例分配,闲时借用 | ⭐⭐⭐⭐⭐ (主流默认) |
| Fair | 动态平衡,响应迅速 | 多队列层级 | 动态计算缺额,公平平分 | ⭐⭐⭐⭐ |
💡 行业现状提示:
随着 Hadoop 生态的演进,特别是 Cloudera 和 Hortonworks 合并为 CDP (Cloudera Data Platform) 后,官方正在大力推荐使用 Capacity Scheduler,并提供了工具将 Fair Scheduler 的配置迁移到 Capacity Scheduler。在 Hadoop 3.x 时代,Capacity Scheduler 已经通过引入更多的高级特性(如内部 Fair 调度、更好的抢占机制)基本涵盖了原来 Fair Scheduler 的优势,成为了当前企业生产环境下的绝对主流。