泡干脆面就番茄头像
关注
Hadoop基础:YARN架构原理与调度器深度解析封面图

Hadoop基础:YARN架构原理与调度器深度解析

YARN从入门到精通:架构原理 + 工作流程 + 三种调度器(面试必看)

本文从YARN的设计初衷出发,结合架构图和工作流程图,系统讲解 YARN四大核心组件、15步工作流程、三种调度器对比,并附上常用运维命令和高频面试题。大数据开发/运维面试必备,建议收藏!


📑 目录


一、YARN是什么?为什么需要YARN?

在学习YARN之前,先思考两个问题:

🤔 如何管理集群资源?
🤔 如何给任务合理分配资源?

这就是YARN要解决的问题。

YARN的定义

YARN(Yet Another Resource Negotiator) 是Hadoop 2.0引入的分布式资源调度平台,负责为运算程序(MapReduce、Spark、Flink等)提供服务器资源(CPU + 内存 + 磁盘 + 网络…)。

可以把YARN理解为一个分布式操作系统平台,而MapReduce/Spark/Flink等运算程序相当于运行在操作系统之上的应用程序。

为什么需要YARN?

在Hadoop 1.x时代,MapReduce同时承担了资源管理和任务计算两个职责,导致:

  • ❌ 耦合度高:资源管理和计算逻辑混在一起
  • ❌ 扩展性差:只能跑MapReduce,不支持其他计算框架
  • ❌ 资源利用率低:JobTracker单点瓶颈

Hadoop 2.0引入YARN后,把资源调度功能从MapReduce中独立出来:

  • ✅ 解耦:资源管理和计算框架分离
  • ✅ 多框架支持:YARN上可以同时运行MapReduce、Spark、Flink、Storm等
  • ✅ 高可用:ResourceManager支持HA

二、YARN核心架构(四大组件)

YARN采用经典的主从架构(Master/Slave),下面这张图完整展示了YARN的四大核心组件以及它们之间的关系:

在这里插入图片描述

上图展示了一个典型的YARN集群运行场景:

  • 客户端提交作业到 ResourceManager(Master)
  • RM选择一个 NodeManager 启动 ApplicationMaster
  • AM向RM申请资源,RM分配 Container
  • AM在各个NM的Container中启动具体的 MapTask / ReduceTask

下面逐个拆解四大组件。


2.1 ResourceManager (RM) —— 集群大管家

RM是整个YARN集群的老大,全局只有一个(HA模式下有Active和Standby两个)。

核心职责:

职责说明
处理客户端请求接收客户端提交的作业
监控NodeManager接收NM的心跳和块报告,感知节点状态
启动/监控ApplicationMaster为每个应用分配第一个Container并启动AM
资源的分配和调度整个集群的资源调度决策核心

🏠 通俗理解:RM就像一家公司的CEO,管全局资源分配,但不直接管具体干活的人。


2.2 NodeManager (NM) —— 节点管理者

NM是每个节点上的资源管理者,集群中有多个(每个Slave节点一个)。

核心职责:

职责说明
管理单个节点上的资源监控本节点的CPU、内存、磁盘等资源使用情况
处理来自RM的命令接收RM的指令,启动/停止Container
处理来自AppMaster的命令响应AM的Container启动请求

🏠 通俗理解:NM就像每个部门的经理,管理本部门的人和资源,向CEO汇报。


2.3 ApplicationMaster (AM) —— 应用负责人

每个应用程序(比如一个MapReduce作业)对应一个AM,AM运行在Container中。

核心职责:

职责说明
申请资源为应用程序向RM申请资源(Container)
分配内部任务将申请到的资源分配给内部的Map/Reduce任务
任务的监控和容错监控任务运行状态,任务失败时重新申请资源重试

🏠 通俗理解:AM就像每个项目的项目经理,向CEO申请人力和资源,然后安排具体的开发人员干活。

注意:

  • 每个应用有一个AM
  • AM也运行在Container中(由NM启动)
  • 不同计算框架有不同的AM实现(MRAppMaster、SparkAM等)

2.4 Container —— 资源容器

Container是YARN中资源的抽象,它封装了某个节点上的多维度资源:

  • CPU
  • 内存
  • 磁盘
  • 网络

核心特点:

特点说明
动态资源分配每个Container的资源量可以不同,根据应用需求分配
隔离性Container之间资源隔离,互不影响
生命周期由RM分配,由NM管理,任务完成后释放

🏠 通俗理解:Container就像公司分配给项目组的办公室和工位,有大有小,项目结束后收回。

四大组件关系总结

客户端 → ResourceManager(全局调度)
                ↓
         NodeManager(节点管理)
                ↓
          Container(资源容器)
                ↓
     ApplicationMaster / MapTask / ReduceTask(运行任务)

三、YARN工作流程(15步完整解析)

理解了四大组件,我们来看一个MapReduce作业提交到YARN上运行的完整过程。下面这张图展示了全部15个步骤:

在这里插入图片描述

3.1 流程图总览

整个流程可以分为 三个阶段:

阶段步骤核心动作
作业提交1~5步客户端提交作业 → RM接收 → 分配第一个Container启动AM
任务分配6~12步AM向RM申请Map/Reduce资源 → RM分配Container
任务执行与收尾13~15步任务执行 → Reduce拉取数据 → 完成注销

3.2 逐步详解

第1步:申请Application

  • 客户端向ResourceManager申请一个Application ID

第2步:资源提交描述

  • 客户端向RM提交作业资源描述(ApplicationSubmissionContext)
  • 包含:作业名称、优先级、队列、所需资源、AM启动命令等

第3步:返回ApplicationId

  • RM返回ApplicationId给客户端

第4步:资源提交(上传到HDFS)

  • 客户端将运行程序所需的资源(jar包、配置文件、输入分片信息等)上传到HDFS

第5步:提交作业

  • 客户端正式向RM提交作业

第6步:RM调度任务

  • RM将作业加入调度队列
  • 调度器(Scheduler)根据调度策略选择一个NodeManager

第7步:NM启动Container(资源隔离)

  • NM在指定节点上启动一个Container
  • 这个Container用于运行 ApplicationMaster

第8步:下载Job资源到本地

  • AM启动后,从HDFS下载作业资源(jar包、配置等)到本地

第9步:向RM申请MapTask资源

  • AM根据输入分片数量,向RM申请MapTask所需的Container资源

第10步:RM分配MapTask容器

  • RM为MapTask分配Container,返回给AM

第11步:AM通知NM启动MapTask

  • AM向对应的NodeManager发送启动MapTask的请求
  • NM启动Container中的MapTask

第12步:向RM申请ReduceTask资源

  • MapTask运行到一定程度后,AM向RM申请ReduceTask资源

第13步:Reduce端shuffle获取到分区数据

  • ReduceTask启动后,通过Shuffle从各个MapTask拉取自己分区的数据

第14步:程序运行完成,申请注销

  • 所有任务运行完成后,AM向RM申请注销自己

第15步:程序运行完毕后,MRAppMaster向ResourceManager申请注销自己

  • RM回收资源,作业结束

💡 面试小技巧:回答YARN工作流程时,可以用"一提交、二启动AM、三申请资源、四运行任务、五注销"的思路来组织答案。


四、YARN三种调度器深度对比

YARN的资源调度是由**调度器(Scheduler)**负责的。YARN提供了三种调度器实现,下面这张图完整展示了三种调度器的工作原理:

在这里插入图片描述


4.1 FIFO Scheduler(先进先出调度器)

调度策略:单队列,根据提交作业的先后顺序,先来先服务。

工作原理:

  • 所有作业提交到同一个队列
  • 按提交顺序排队,先到的作业先分配资源
  • 只有前面的作业资源满足了,后面的作业才能运行

优缺点:

优点缺点
简单易懂,实现简单不支持多队列,大任务会阻塞小任务
生产环境很少使用

📌 适用场景:单用户、小集群、测试环境


4.2 Capacity Scheduler(容量调度器)

调度策略:多用户多队列,每个队列配置一定的资源容量,队列内部采用FIFO调度。

核心特点:

特点说明
多队列每个队列可配置一定的资源量,队列内部FIFO
容量保证可为每个队列设置资源最低保证和资源使用上限
灵活性队列资源有剩余时,可暂时共享给需要资源的队列;一旦本队列有新任务,其他队列释放资源后归还给该队列
多租户支持多用户共享集群,每个用户的作业独立队列

队列结构示例:

root
├── queueA  20%
├── queueB  50%
├── queueC  30%
└── default 50% (剩余资源)

📌 适用场景:企业生产环境最常用,适合有明确SLA要求、多团队共享集群的场景


4.3 Fair Scheduler(公平调度器)

调度策略:多用户多队列,按权重公平分配资源,同一队列内所有作业公平共享资源。

核心特点:

特点说明
公平分配所有作业公平共享资源,短任务不会饿死
多队列支持多队列,队列之间按权重分配
资源抢占队列资源不足时,可以从资源过剩的队列抢占资源
负载均衡自动平衡各队列的资源使用

Capacity和Fair的相同点

  1. 都是多队列调度器
  2. 都支持容量保证(最低资源保障)
  3. 都支持资源共享(队列空闲资源可借给其他队列)
  4. 都支持多租户

Capacity和Fair的核心区别

对比维度Capacity SchedulerFair Scheduler
调度策略按队列容量比例分配,队列内FIFO按公平策略分配,队列内也公平
队列内调度FIFO(可配置优先级)Fair / FIFO / DRF(可选)
资源抢占不支持(或有限支持)支持
适用场景生产环境稳定运行,SLA明确研发团队共享,追求公平性

🔥 面试高频题:Capacity和Fair调度器的区别?

  • 核心区别:Capacity按容量分配,队列内FIFO;Fair按公平策略分配,队列内也公平共享
  • Capacity更稳定可预测,Fair更灵活公平

4.4 三种调度器对比总结

对比维度FIFOCapacityFair
队列数单队列多队列多队列
调度策略先进先出容量比例 + FIFO公平分配
多用户支持❌✅✅
资源抢占❌❌✅
小任务等待时间长(可能被大任务阻塞)中(有队列隔离)短(公平分配)
生产环境常用❌✅(最常用)✅
默认调度器✅(YARN默认)❌❌

💡 生产环境怎么选?

  • 大多数公司用 Capacity Scheduler,因为稳定可预测,适合按团队划分队列
  • 研发氛围浓厚、追求公平的团队可以用 Fair Scheduler

五、YARN常用运维命令

5.1 查看Application

# 列出所有Application
yarn application -list

# 按状态过滤(ALL/NEW/SUBMITTED/ACCEPTED/RUNNING/FINISHED/FAILED/KILLED)
yarn application -list -appStates RUNNING
yarn application -list -appStates FAILED

# 查看某个Application的状态
yarn application -status <applicationId>

# 杀死某个Application
yarn application -kill <applicationId>

5.2 查看日志

# 查询整个Application的日志
yarn logs -applicationId <applicationId>

# 查询某个Container的日志
yarn logs -applicationId <applicationId> -containerId <containerId>

# 查询某个ApplicationAttempt的日志
yarn logs -applicationId <applicationId> -appAttemptId <appAttemptId>

5.3 查看节点和队列

# 列出所有节点
yarn node -list -all

# 查看某个节点的状态
yarn node -status <nodeId>

# 查看队列状态
yarn queue -status <队列名称>

# 刷新队列配置(无需重启YARN)
yarn rmadmin -refreshQueues

5.4 Container和ApplicationAttempt

# 列出某个Application的所有attempt
yarn applicationattempt -list <applicationId>

# 查看某个attempt的状态
yarn applicationattempt -status <appAttemptId>

# 列出某个attempt下的所有Container
yarn container -list <appAttemptId>

# 查看某个Container的状态
yarn container -status <containerId>

六、高频面试题汇总

基础概念

Q1:YARN是什么?有什么作用?

YARN是Hadoop 2.0引入的分布式资源调度框架,负责集群资源的统一管理和调度。作用是将资源管理和计算框架解耦,支持多种计算框架运行在同一个集群上。

Q2:YARN的四大组件是什么?各自的作用?

  • ResourceManager:全局资源管理,负责集群资源分配和调度
  • NodeManager:节点资源管理,负责本节点的Container管理
  • ApplicationMaster:每个应用的管理者,负责向RM申请资源、监控任务
  • Container:资源抽象,封装CPU、内存等资源

Q3:Container是什么?和进程有什么区别?

Container是YARN的资源分配单位,封装了CPU、内存等资源。Container是逻辑概念,进程是实际运行的程序。一个Container中可以运行一个或多个进程。


工作流程

Q4:YARN的工作流程是怎样的?

  1. 客户端提交作业到RM
  2. RM选择一个NM启动AM(在Container中)
  3. AM向RM申请资源
  4. RM分配Container,AM在Container中启动任务
  5. 任务运行完成,AM向RM注销

Q5:ApplicationMaster的作用是什么?

  • 向RM申请资源(Container)
  • 与NM通信,启动/停止Container中的任务
  • 监控任务运行状态,任务失败时重试
  • 任务完成后向RM注销

调度器

Q6:YARN有哪三种调度器?区别是什么?

  • FIFO:先进先出,单队列,简单但不适合共享集群
  • Capacity:容量调度,多队列按容量分配,生产最常用
  • Fair:公平调度,多队列按公平策略分配,支持资源抢占

Q7:Capacity和Fair调度器的区别?

  • 核心调度策略不同:Capacity按容量比例,Fair按公平策略
  • 队列内调度不同:Capacity是FIFO,Fair可以配置Fair/FIFO/DRF
  • Fair支持资源抢占,Capacity不支持
  • Capacity更稳定可预测,Fair更灵活公平

Q8:为什么FIFO调度器不适合生产环境?

因为FIFO是单队列,大任务会占用所有资源,导致后面的小任务长时间等待,无法满足多用户共享集群的需求。


调优与排障

Q9:Container被杀死的原因有哪些?

  • 内存超限:物理内存或虚拟内存超过Container配置的上限
  • 节点故障:NodeManager挂掉或失联
  • 任务超时:任务运行时间超过设置的超时时间
  • 资源抢占:被更高优先级的任务抢占资源

Q10:YARN的Web UI端口是多少?能看到什么?

默认端口是 8088。可以查看所有Application的状态、节点列表、队列状态、调度器信息等。


七、总结

本文系统梳理了YARN的核心知识,从架构到流程再到调度器,最后附上常用命令和面试题。

📌 核心知识速记

模块核心要点
YARN定位分布式资源调度平台,操作系统级别的存在
四大组件RM(全局调度)+ NM(节点管理)+ AM(应用管理)+ Container(资源容器)
工作流程提交作业 → 启动AM → 申请资源 → 运行任务 → 注销(15步)
三种调度器FIFO(简单少用)、Capacity(生产最常用)、Fair(公平灵活)
生产推荐Capacity Scheduler

🔥 面试必背:四大组件职责、工作流程、三种调度器对比,这三个是最高频考点!


转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2301_80420058/article/details/167587655

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--