基于本文回答
0
评论

Yarn的Fair Scheduler(公平调度器)

知识点图片

YARN Fair Scheduler(公平调度器) 是 Apache Hadoop YARN 中三种主要的资源调度器之一(另外两种是 FIFO Scheduler 和 Capacity Scheduler)。它的核心设计理念是:随着时间的推移,让所有运行在集群中的应用(Application)能够公平地获取计算资源(内存和 CPU)。

它是为了解决多用户、多任务共享集群时的资源分配问题而诞生的,非常适合多租户的生产环境。

以下是关于 Fair Scheduler 的详细解析:


1. 核心工作原理

Fair Scheduler 的基本表现是:

  • 当集群中只有一个应用在运行时:该应用可以独占整个集群的所有资源。
  • 当有新的应用提交时:调度器会动态地将释放出来的空闲资源分配给新应用,直到各个应用获得的资源量达到“公平”的比例。

举个通俗的例子:
假设集群总内存为 100GB。

  1. 用户 A 提交了任务 1,此时集群空闲,任务 1 独占 100GB 资源。
  2. 用户 B 提交了任务 2,调度器开始调整。任务 1 运行完毕的容器(Container)释放资源后,会优先分给任务 2。最终,任务 1 和任务 2 各占 50GB。
  3. 如果此时用户 A 又提交了任务 3,最终分配可能会变成:用户 A(任务 1 和任务 3 共占 50GB,各 25GB),用户 B(任务 2 占 50GB)。

2. 核心特性与概念

(1) 队列(Queues)与层级结构

Fair Scheduler 通过队列来组织和管理任务。队列可以嵌套(即父队列和子队列),形成树状的层级结构。每个队列可以配置不同的权重(Weights)和资源限制。

(2) 权重(Weights)

“公平”并不意味着绝对的平均。你可以为不同的队列分配不同的权重。

  • 例如:Queue A 权重为 2,Queue B 权重为 1。当两者都需要满负荷运转时,Queue A 将获得 2/3 的集群资源,Queue B 获得 1/3。

(3) 最小/最大资源共享(Min/Max Shares)

  • Min Share(最小保证):保证某个队列至少能获取到的资源量。如果该队列有任务,调度器会优先满足它的最小资源量。
  • Max Share(最大限制):限制某个队列最多能使用的资源量,防止某个流氓任务耗尽整个集群的资源。

(4) 资源抢占(Preemption)

这是 Fair Scheduler 非常重要的一个特性。
假设 Queue A 的空闲资源被 Queue B 借用了。此时 Queue A 突然提交了新任务,需要拿回属于自己的资源(达到 Min Share 或公平比例)。如果 Queue B 迟迟不释放资源,调度器会强行 Kill 掉 Queue B 中正在运行的 Container(容器),将资源抢占回来给 Queue A 使用

(5) 主导资源公平算法(DRF - Dominant Resource Fairness)

在早期的 Hadoop 中,调度器只考虑内存。但在 YARN 中,资源包含了内存和 CPU
如果任务 A 是 CPU 密集型,任务 B 是内存密集型,怎么分配才算“公平”?
Fair Scheduler 引入了加州大学伯克利分校提出的 DRF 算法。它会找出每个应用需求占比最大的资源(即“主导资源”),然后基于主导资源的比例来计算公平性,从而实现多维度资源的公平分配。


3. Fair Scheduler 的配置文件

Fair Scheduler 的配置通常涉及两个文件:

  1. yarn-site.xml:在这里声明使用 Fair Scheduler。
    xml
    <property>
      <name>yarn.resourcemanager.scheduler.class</name>
      <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    </property>
  2. fair-scheduler.xml(或类似名称):在这里定义队列结构、权重、ACL(访问控制列表)、最小/最大资源等具体规则。

4. Fair Scheduler vs Capacity Scheduler (容量调度器)

这往往是面试或架构选型时最常问的问题:

特性 Fair Scheduler (公平调度器) Capacity Scheduler (容量调度器)
设计初衷 强调任务间的“公平共享”,让所有任务平滑获取资源。 强调为不同组织/部门提供“有保证的容量”,同时允许资源共享。
队列分配 侧重于按权重动态划分整体资源。 侧重于为队列配置固定的百分比(Capacity)。
易用性 配置相对简单,自动分配机制智能,无需过多干预即可实现较高的资源利用率。 配置较为复杂,需要严格规划各个队列的容量占比。
主要支持者(历史) Cloudera (CDH) 默认使用。 Hortonworks (HDP) 默认使用。

5. 行业现状与发展提示 (非常重要)

如果你现在正在学习或使用最新版本的 Hadoop:
随着 Cloudera 和 Hortonworks 合并成为新的 Cloudera (CDP平台),社区和商业版都在进行功能整合。
在 Hadoop 3.x 以及 CDP 平台中,YARN 社区决定将 Capacity Scheduler 作为统一的、默认的调度器

为了弥补损失,Capacity Scheduler 已经吸收了大量 Fair Scheduler 的优秀特性(如基于权重的动态分配、更好的抢占机制等)。虽然 Fair Scheduler 在较老的 CDH 5/6 版本中仍在广泛使用,但在未来的架构演进中,向 Capacity Scheduler 迁移已经是大势所趋。

右滑查看面试常问