YARN调度器的工作原理

调度器是 ResourceManager 中最核心的组件,它决定了集群资源如何分配给多个竞争中的应用程序,
其设计直接影响着集群的吞吐量、公平性和利用率。

核心概念
在深入原理之前,先理解几个关键概念:
资源模型:YARN 将资源抽象为 Container,每个 Container 代表一定量的 内存(MB) 和 CPU 虚拟核心(vCores)。
资源请求:ApplicationMaster 以 <资源量, 数量, 位置偏好> 的形式向调度器申请资源。例如:<2 GB, 1 vCore, 10个, /data/node1>。
位置偏好:为了实现“计算向数据移动”,AM 会优先请求存储有数据的节点(Node-Local),其次是同一机架(Rack-Local),最后是任意节点(Off-Switch)。
队列:资源被组织成队列,通常对应不同的部门、团队或项目。每个队列有特定的资源容量限制。

调度器核心工作原理
调度器的工作就像一个不断循环的 “决策引擎”,其基本工作流程可以概括为以下步骤:

下面我们来详细解析这个流程中的关键环节。

1. 触发时机:节点心跳
调度决策不是主动轮询,而是由 事件驱动 的,最主要的触发事件是 NodeManager 的心跳。
当 NM 向 RM 发送心跳时,它会报告该节点的 可用资源(可用的内存和 CPU)。
调度器一收到这个心跳,就会立即尝试将这部分“刚刚释放出来”的资源分配给等待中的应用程序。

2. 决策层次:队列 -> 应用 -> 容器
调度器做出“该把资源给谁”的决策是一个两层筛选过程:
选择队列:在层次化的队列结构中,根据调度策略(容量、公平等)决定哪个队列应该获得这批资源。
选择应用:在选定的队列中,根据策略(FIFO、公平排序等)决定哪个应用程序有资格获得资源。
分配容器:为选定的应用程序分配一个具体的 Container,并满足其位置偏好。

3. 资源分配与位置感知
这是调度器中最复杂的环节之一,因为它需要在 调度效率 和 数据本地性 之间做权衡。
优先级:调度器会优先满足 Node-Local 请求,其次是 Rack-Local,最后是 Off-Switch。
延迟调度:为了达到更好的本地性,调度器可能会 “跳过” 当前不满足本地性要求的应用,
即使它是队列中最优先的应用。它会等待一小段时间(比如几次心跳),期望出现一个更匹配的节点。
如果等待超时,则会放松约束,接受 Rack-Local 或 Off-Switch。

4. 资源抢占
这是保证公平性和服务等级协议的关键机制。
场景:当一个队列资源不足,而另一个队列超量使用资源时发生。
过程:调度器会向超量队列中正在运行的 Container 发送 SIGTERM 信号,要求其优雅退出。
如果 Container 在一定时间内没有自行退出,RM 会通过 NM 强制杀死它(SIGKILL)。
目的:释放出的资源可以分配给资源不足的队列,确保其获得承诺的最小资源量。

三种主要调度器策略的差异
YARN 提供了多种调度器实现,它们的核心区别就在于上述 决策层次 中使用的算法不同。

特性		|FIFO Scheduler		|Capacity Scheduler											|Fair Scheduler
核心思想	|先到先得,简单队列	|静态资源划分,专队专享,弹性借用							|动态资源分配,按需共享,实时公平
队列组织	|单个队列			|层次化队列,每个队列有保证的容量							|层次化队列,每个队列有最小共享资源
资源分配	|严格按照提交顺序	|1. 队列内:通常为FIFO     									|1. 队列内:公平共享(Fair Sharing)
                                |2. 队列间:保证各自容量,空闲资源可被其他队列弹性使用 	   	|2. 队列间:公平共享,满足最小共享量                  
优点		|简单,低延迟						|资源隔离性好,适合多租户生产环境;灵活性高	|资源利用率高,公平性好,小应用能快速获得资源
缺点		|不适合共享集群,大应用会阻塞小应用	|配置复杂;资源可能闲置(如果不配置弹性)	|缺乏严格的资源隔离;动态分配可能带来不确定性
适用场景	|已淘汰,仅用于学习					|Hadoop 默认调度器,多团队、多项目共享集群	|对交互式查询和短期作业友好的混合工作负载

#总结:调度器的工作原理精髓
事件驱动:以 NodeManager 心跳为触发点,进行增量式调度。
层次化决策:通过“选队列 -> 选应用 -> 分配容器”的两级筛选模型,将复杂的全局调度问题分解。
权衡艺术:在 公平性、数据本地性、集群利用率 和 响应速度 等多个目标之间进行权衡。例如,
延迟调度用一点点调度延迟换取更好的数据本地性,从而提升整体吞吐量。
资源保障与回收:通过 容量/最小共享 保证基本服务,通过 抢占 机制在资源紧张时强制执行这些保证。
理解 YARN 调度器的工作原理,对于调优集群性能、合理规划队列资源和解决生产环境中的资源竞争问题至关重要。
#在实际应用中,Capacity Scheduler 因其良好的隔离性和稳定性,成为了大多数生产集群的首选。

Yarn是Hadoop的资源管理系统,其核心功能是负责任务调度,旨在解决给job分配集群资源的问题。官方提供了三种调度器,公平调度器便是其中之一,调度器的配置和选择对整个集群资源利用率、Hadoop运行的稳定性和效率有重要影响[^1]。 公平调度器(Fair Scheduler)会在多个作业间动态平衡资源使用。每个作业在运行过程中,会根据其需求和当前集群资源的使用情况,公平地分配到一定的资源。与FIFO调度器按作业提交顺序依次执行不同,公平调度器允许多个作业同时运行,并且会根据作业的优先级和资源需求,动态调整资源分配。 在使用方面,若要使用公平调度器,需要在`yarn-default.xml`文件中进行相关配置,例如指定调度器类: ```xml <property> <description>The class to use as the resource scheduler.</description> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> ``` 关于队列配置,有一些参数需要注意。例如`yarn.scheduler.fair.user-as-default-queue`,该参数用于设置在未指定队列的情况下,是否使用【用户名】作为队列名。设置为`true`时,当用户提交作业且不指定队列名,会自动创建并使用名为`root.用户名`的队列;设置为`false`时,当用户提交作业且不指定队列名,自动使用`root.default`队列。不过当配置了`yarn.scheduler.fair.allocation.file`时,本配置将被忽略[^4]。 在原理上,公平调度器会周期性地检查各个作业的资源使用情况,根据作业的公平份额(fair share)来分配资源。公平份额是根据作业的优先级和资源需求计算得出的。如果某个作业的资源使用低于其公平份额,调度器会尝试为其分配更多资源;反之,如果某个作业的资源使用超过了其公平份额,调度器可能会减少其资源分配,以保证其他作业也能得到公平的资源分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值