一、Yarn产生背景

Yarn(全称为Yet Another Resource Negotiator,译为"另一个资源协调者")在Hadoop2.0版本中引入,其诞生是为了解决 Hadoop 1.x 架构中 MapReduce 的资源管理和计算框架耦合 的问题。简而言之,就是之前MapReduce的资源管理和计算框架是耦合在一起的,为了解耦而设计出了Yarn。

Yarn是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,提供统一的资源管理和调度,其核心特性有以下几点:

  1. 资源管理和计算框架完全解耦
  2. 支持多种计算框架(如MapReduce、Spark、Flink)
  3. 提升集群资源利用率和扩展性

二、Yarn系统架构

image.png
ResourceManager(RM):全局资源管理器,主要包含两个部分,资源调度器(Scheduler)和 应用管理器(Applications Manager)

  1. 资源调度器(Scheduler)不直接参与任务调度,仅根据调度策略(如Capacity Scheduler、Fair Scheduler)分配集群资源(CPU、内存)给应用程序
  2. 应用管理器(Applications Manager):接受客户端提交的应用程序(如MapReduce、Spark、Flink作业),并且为每个应用分配第一个Container以启动 ApplicationMaster(AM),监控AM的运行状态

NodeManager(NM):节点管理器,包含自身节点资源管理和具体任务执行

  1. 节点资源监控:定期向 RM 汇报本节点的资源使用情况(CPU、内存、磁盘)
  2. Container生命周期管理:根据 RM 和 AM 的指令,启动或销毁Container,确保Container正确运行

ApplicationMaster(AM):应用程序管理器,包含资源申请和任务调度,注意AM也是运行在Container中的

  1. 资源申请:向 RM 申请运行任务所需的Container(如 MapTask、Spark Executor)
  2. 任务调度:拿到Container信息后,直接与对应的NM通信,由NM来启动或停止Container,里面就是运行具体的任务
  3. 状态汇报:向 RM 汇报应用程序进度和最终状态(成功/失败)

Container:资源抽象和任务执行单元(是资源的抽象概念,比如一个Container分配了2个vCore和 4GB内存,用于运行 Reduce Task)

  1. 资源封装隔离:包含 CPU 核数、内存、网络等资源配额,Container之间互不影响
  2. 任务执行单位每个任务(如 MapTask、Spark Executor)运行在一个独立的Container中

三、Yarn应用提交流程(以 提交Flink作业 为例)

3.1 客户端准备并提交Flink作业

  1. 用户准备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
  2. 客户端与 RM 交互:通过flink run提交Flink作业(Flink客户端会将 Flink 作业Jar包、flink-conf.yaml和依赖库上传到HDFS),RM分配资源并启动 AM(即Flink的JobManager)

3.2 启动ApplicationMaster(Flink的JobManager)

  1. RM选择一个NodeManager来启动AM(Flink的JobManager)
  2. JobManager加载HDFS上的Flink作业 JAR包、Flink配置 和 依赖
  3. 生成作业执行图(JobGraph),准备调度 TaskManager

3.3 申请TaskManager

  1. JobManager 根据用户配置(如 -yn、-ytm)向 RM 申请容器,每个容器对应一个TaskManager实例
  2. RM 根据调度策略分配容器给 JobManager,NodeManager 收到JobManager的请求后启动 TaskManager 容器
  3. 每个 TaskManager 启动时向 JobManager 注册,并汇报 Slot 资源

3.4 作业执行

  1. JobManager 将作业拆分为 Task,分配到 TaskManager 的 Slot 中执行
  2. TaskManager 执行任务并汇报状态

3.5 作业完成与资源释放

  1. 所有任务完成后,JobManager 向 RM 发送完成信号
  2. 释放所有 TaskManager 容器,JobManager(AM)退出
  3. 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调度器有以下几个特性:

  1. 顺序排队:所有作业按提交顺序排队,依次分配资源
  2. 无资源隔离:这将导致大作业可能长时间占用资源,导致小作业“饿死”

由此可见,FIFO调度器的资源利用率低,无法满足生产环境的多团队协作需求,一般仅用于测试环境

5.2 Capacity Scheduler

容量调度器有几个特性:

  1. 队列划分:集群资源划分为多个逻辑队列(如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>
  1. 弹性资源共享:若某队列资源空闲,其他队列可借用

由于容量调度器的资源隔离特性,可以保证关键业务不受其他任务影响,并且支持弹性资源共享,资源利用率高,是传统大数据平台的主流选择

5.3 Fair Scheduler

公平调度器主要有以下特性:

  1. 动态公平分配:队列内资源按“公平份额”(Fair Share)分配,优先满足小作业或等待时间长的作业
  2. 弹性资源共享:与上面的容量调度器类似
  3. 层级队列:支持树形队列结构(如 root.queue1.subqueue)

公平调度器适用于资源弹性需求高的场景,比如需要快速响应短作业、实时任务和批处理任务同时存在等场景

六、常见问题

资源不足(作业卡在 ACCEPTED 状态)

现象:作业长时间处于 ACCEPTED 状态,无法启动 ApplicationMaster(AM),并且YARN的Web UI 显示队列资源占用率接近 100%

可能原因:

  1. 队列配置的 capacity 不足或 maxCapacity 限制过低
  2. 大作业占满资源(单个Container申请资源量超过NM剩余可用量)
  3. 物理资源不足

解决方法:

  1. 调整队列配置,调高队列的容量百分比
  2. 检查Container的资源参数,如-Xmx
  3. 扩容yarn集群

AM启动失败问题

现象:AM 容器启动后立即退出,作业状态变为 FAILED,日志中报错Container exited with non-zero exit code 1

可能原因:

  1. AM 进程依赖的 JAR 文件未上传到 HDFS 或路径错误
  2. AM 容器的内存/CPU 配置过低

解决方法:

  1. 确保 Flink/Spark 作业的 JAR 和依赖库已上传到 HDFS 正确路径
  2. 增加AM资源
flink run -m yarn-cluster -yjm 2048 ... # 提高 AM 内存至 2048M

七、总结

YARN 凭借其松耦合架构(支持多种计算框架)和灵活的资源管理能力成为大数据生态的基石。无论是传统批处理还是实时计算,YARN 都能通过其标准化接口和高可靠性,为企业提供稳定高效的计算资源支撑


kamier
1.5k 声望498 粉丝