一、Yarn产生背景
Yarn(全称为Yet Another Resource Negotiator,译为"另一个资源协调者")在Hadoop2.0版本中引入,其诞生是为了解决 Hadoop 1.x 架构中 MapReduce 的资源管理和计算框架耦合
的问题。简而言之,就是之前MapReduce的资源管理和计算框架是耦合在一起的,为了解耦而设计出了Yarn。
Yarn是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,提供统一的资源管理和调度
,其核心特性有以下几点:
- 资源管理和计算框架完全解耦
- 支持多种计算框架(如MapReduce、Spark、Flink)
- 提升集群资源利用率和扩展性
二、Yarn系统架构
ResourceManager(RM):全局资源管理器,主要包含两个部分,资源调度器(Scheduler)和 应用管理器(Applications Manager)
资源调度器(Scheduler)
:不直接参与任务调度,仅根据调度策略(如Capacity Scheduler、Fair Scheduler)分配集群资源(CPU、内存)给应用程序应用管理器(Applications Manager)
:接受客户端提交的应用程序(如MapReduce、Spark、Flink作业),并且为每个应用分配第一个Container以启动 ApplicationMaster(AM),监控AM的运行状态
NodeManager(NM):节点管理器,包含自身节点资源管理和具体任务执行
节点资源监控
:定期向 RM 汇报本节点的资源使用情况(CPU、内存、磁盘)Container生命周期管理
:根据 RM 和 AM 的指令,启动或销毁Container,确保Container正确运行
ApplicationMaster(AM):应用程序管理器,包含资源申请和任务调度,注意AM也是运行在Container中的
资源申请
:向 RM 申请运行任务所需的Container(如 MapTask、Spark Executor)任务调度
:拿到Container信息后,直接与对应的NM通信,由NM来启动或停止Container,里面就是运行具体的任务状态汇报
:向 RM 汇报应用程序进度和最终状态(成功/失败)
Container:资源抽象和任务执行单元(是资源的抽象概念,比如一个Container分配了2个vCore和 4GB内存,用于运行 Reduce Task)
资源封装隔离
:包含 CPU 核数、内存、网络等资源配额,Container之间互不影响任务执行单位
:每个任务(如 MapTask、Spark Executor)运行在一个独立的Container中
三、Yarn应用提交流程(以 提交Flink作业 为例)
3.1 客户端准备并提交Flink作业
用户准备Flink作业:包括Flink的作业Jar包,配置Flink的参数(并行度、内存)
# Per-Job 模式 flink run -m yarn-cluster -yn 2 -ys 4 -yjm 1024 -ytm 2048 flink-job.jar --input hdfs:///data --output hdfs:///result
- 客户端与 RM 交互:通过flink run提交Flink作业(Flink客户端会将 Flink 作业Jar包、flink-conf.yaml和依赖库上传到HDFS),
RM分配资源并启动 AM(即Flink的JobManager)
3.2 启动ApplicationMaster(Flink的JobManager)
- RM选择一个NodeManager来启动AM(Flink的JobManager)
- JobManager加载HDFS上的Flink作业 JAR包、Flink配置 和 依赖
- 生成作业执行图(JobGraph),准备调度 TaskManager
3.3 申请TaskManager
- JobManager 根据用户配置(如 -yn、-ytm)向 RM 申请容器,每个容器对应一个TaskManager实例
- RM 根据调度策略分配容器给 JobManager,
NodeManager 收到JobManager的请求后启动 TaskManager 容器
- 每个 TaskManager 启动时向 JobManager 注册,并汇报 Slot 资源
3.4 作业执行
- JobManager 将作业拆分为 Task,分配到 TaskManager 的 Slot 中执行
- TaskManager 执行任务并汇报状态
3.5 作业完成与资源释放
- 所有任务完成后,JobManager 向 RM 发送完成信号
- 释放所有 TaskManager 容器,JobManager(AM)退出
- YARN 自动删除临时文件(如 HDFS 上的作业 JAR 和 依赖库)
四、Yarn常用命令
- 任务相关
# 查看所有任务
yarn application -list
# 查看指定状态(如ACCEPTED/RUNNING)的任务列表
yarn application -list -appStates RUNNING
# 查看指定任务详情
yarn application -status <ApplicationID>
# 杀死指定任务
yarn application -kill <ApplicationID>
- 节点相关
# 查看集群节点状态
yarn node -list
- 日志相关
# 查看任务日志
yarn logs -applicationId <ApplicationID>
五、Scheduler调度策略
YARN 支持三种主要的调度策略,FIFO Scheduler(先进先出)、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)
,分别适用于不同的场景:
5.1 FIFO Scheduler
FIFO调度器有以下几个特性:
- 顺序排队:所有作业按提交顺序排队,依次分配资源
- 无资源隔离:这将导致大作业可能长时间占用资源,导致小作业“饿死”
由此可见,FIFO调度器的资源利用率低,无法满足生产环境的多团队协作需求,一般仅用于测试环境
5.2 Capacity Scheduler
容量调度器有几个特性:
- 队列划分:集群资源划分为多个逻辑队列(如prod、dev),每个队列可以配置最低容量保障,队列内FIFO
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>prod,dev,research</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.prod.capacity</name>
<value>60</value> <!-- prod 队列占 60% 资源 -->
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>30</value>
</property>
- 弹性资源共享:若某队列资源空闲,其他队列可借用
由于容量调度器的资源隔离特性,可以保证关键业务不受其他任务影响,并且支持弹性资源共享,资源利用率高,是传统大数据平台的主流选择
5.3 Fair Scheduler
公平调度器主要有以下特性:
- 动态公平分配:队列内资源按“公平份额”(Fair Share)分配,优先满足小作业或等待时间长的作业
- 弹性资源共享:与上面的容量调度器类似
- 层级队列:支持树形队列结构(如 root.queue1.subqueue)
公平调度器适用于资源弹性需求高的场景,比如需要快速响应短作业、实时任务和批处理任务同时存在等场景
六、常见问题
资源不足(作业卡在 ACCEPTED 状态)
现象:作业长时间处于 ACCEPTED 状态,无法启动 ApplicationMaster(AM),并且YARN的Web UI 显示队列资源占用率接近 100%
可能原因:
- 队列配置的 capacity 不足或 maxCapacity 限制过低
- 大作业占满资源(单个Container申请资源量超过NM剩余可用量)
- 物理资源不足
解决方法:
- 调整队列配置,调高队列的容量百分比
- 检查Container的资源参数,如-Xmx
- 扩容yarn集群
AM启动失败问题
现象:AM 容器启动后立即退出,作业状态变为 FAILED,日志中报错Container exited with non-zero exit code 1
可能原因:
- AM 进程依赖的 JAR 文件未上传到 HDFS 或路径错误
- AM 容器的内存/CPU 配置过低
解决方法:
- 确保 Flink/Spark 作业的 JAR 和依赖库已上传到 HDFS 正确路径
- 增加AM资源
flink run -m yarn-cluster -yjm 2048 ... # 提高 AM 内存至 2048M
七、总结
YARN 凭借其松耦合架构(支持多种计算框架)和灵活的资源管理能力
,成为大数据生态的基石。无论是传统批处理还是实时计算,YARN 都能通过其标准化接口和高可靠性,为企业提供稳定高效的计算资源支撑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。