YARN 分布式资源管理系统
一、YARN 简介
前提:hadoop1.x版本是没有yarn,由一个节点负责计算框架和资源管理框架,分发任务到其他节点,同时实时汇报这个节点。比较简单,这个节点任务重,不具备高可用,单点故障高,同时资源管理太简单了,这考虑任务task个数,不考虑硬件资源,没有考虑一些作业是很消耗资源的。
hadoop2.x 提出了yarn
YARN = Hadoop 集群的操作系统 / 资源大管家/ 分布式通用资源管理系统
整个集群所有机器的 CPU、内存、磁盘 IO、网络带宽全部统一收归 YARN 管理;
可以将(Hive、Spark、MapReduce、Flink 离线、自己编写的任务)的作业调度到hdfs上运行,
由 YARN 分配资源、管控运行、回收资源。
yarn在大数据的位置

二、YARN 架构

yarn是典型的主从架构,主节点是ResourceManager(RM),从节点是NodeManager(NM)。面对单点故障会做热备节点就是 绿色的ResourceManager(RM)。使用zookeeper进行选举产生
RM 现在只管资源的分配,不管作业分配了,把作业剥离到ApplictionMaster上,由作业自己来管,减少了自身的压力,以及一主多备,实现高可用。
客户端提交(Hive、Spark、MapReduce、Flink 离线、自己编写的任务)作业,主要提交的作用实现了ApplictionMaster的接口,它就可以运行在集群中,实现通用性
客户端向RM提交任务,RM在所有NM上进行资源分配(cpu,内存),这些资源封装到Container中。客户端第一次提交的作业会分配一个Container,会运行作业自己的管理进程ApplictionMaster,这才开始进行作业的具体解析,发现作用运行需要额外三个资源,就向RM申请资源,RM就在所有从节点中找到三个资源封装成Container,给到ApplictionMaster。
ApplictionMaster拿到资源后,把自己的作业解析处来,这个task分发到Container进行运行,这些task在运行过程中,实时向ApplictionMaster汇报,ApplictionMaster发现所有task都运行完后,再向ResourceManager申请释放资源,将4个task所占的Container释放掉,整个作业的执行流程都执行完了
| 组件 | 部署位置 | 核心职责 |
|---|---|---|
| ResourceManager(RM) | 集群全局唯一主节点 | 1. 接收所有客户端任务提交请求;2. 汇总全集群 NM 资源,统一调度分配;3. 为每个任务启动 AM,监控 AM 运行状态;4. 接收 NM 心跳,判断节点在线状态 |
| NodeManager(NM) | 每台业务机器 1 个 | 1. 管理本机所有 CPU、内存硬件资源;2. 创建、销毁隔离容器 Container;3. 定时向 RM 上报本机资源占用;4. 执行容器启停,监控容器进程 |
| ApplicationMaster(AM) | 每个任务单独 1 个,运行在 Container 内 | 1. 向 RM 批量申请 Map/Reduce 容器资源;2. 拆分计算任务,下发至各 NM 执行;3. 监控子任务,失败自动申请新容器重试;4. 任务结束后释放全部资源 |
| Container | 资源最小隔离单元 | 封装 CPU + 内存资源,AM、MapTask、ReduceTask 全部运行在容器中,实现任务资源隔离,互不抢占 |
yarn 工作机制

client客户端提交作业到ResourceManager,
ResourceManager就在所有从节点中申请资源,申请到的资源封装为Container。
第一次提交的作业,会分配一个Container运行作业自己的ApplicationMaster
ApplicationMaster运行起来,解析作业,发现需要多少Container资源
ApplicationMaster再向ResourceManager申请资源
ResourceManager再从从节点中申请到Container,分配给ApplicationMaster
ApplicationMaster拿到这些Container资源,
ApplicationMaster就把自己解析处来的task作业分发到这些Container里面,进行运算
这些task作业运行时,会实时向ApplicationMaster进行汇报
ApplicationMaster拿到这些汇报信息之后,也会对task任务监控,如果一个task挂掉了,会尝试重启
ApplicationMaster发现所有task都运行结束,向ResourceManager申请释放资源
ResourceManager就把所有Container,这里(两个task的,一个ApplicationMaster的)3个全部释放掉
作业结束。

yarn的高可用是又多台主节点实现的,这些主节点的状态由zookeeper进行管理切换的,从所有主节点选举一个做管理节点,管理节点挂了,zookeeper会选举产生新的管理节点,管理节点的元数据同步直接放在zookeeper里,新选举的管理节点从zookeeper中同步元数据信息,实现集群的管理。
在管理节点挂了后,任务会阻塞,等待产生新的管理节点
三、YARN 四大核心能力
1. 统一管理全集群硬件资源(CPU / 内存)
- 每台服务器上的 NodeManager 会上报本机可用内存、CPU 核心数;
- ResourceManager 汇总所有机器资源,形成全局资源池;
-
硬性隔离:不同任务之间内存、CPU 互不抢占,一个任务爆内存不会把整台机器拖垮。
-
举例:一台机器 256G 内存,系统预留 20G,剩余 236G 全部交给 YARN 分配给任务容器。
2. 接收所有计算任务,分配运行资源(Container)
任何计算程序(Hive SQL、Spark、MR)提交给 YARN 后:
-
YARN 先分配一小块容器启动任务总管 AM;
-
AM 再向 RM 申请多份容器,用来跑 Map、Reduce、Spark Task;
-
每个容器固定分配内存 + CPU,比如 4G 内存 1 核、8G 内存 2 核。
没有 YARN:程序自己抢占机器资源,多个任务并发直接 OOM、机器卡死。
3. 全程监控任务运行,故障自动重试
- NodeManager 实时监控本机所有容器进程;
- 容器崩溃、内存超限、节点宕机,立刻上报 RM;
- AM 收到失败信号后,自动向 RM 申请新容器,重新执行失败分片;
-
记录任务运行日志,支持事后排查报错。
-
收拢全集群机器的内存、CPU 资源;
- 给每一个计算任务分配独立隔离的容器;
- 监控任务死活,失败自动重试;
- 多业务队列公平调度,保障核心业务资源。
四、Hive SQL 完整 YARN 执行流程
- 你执行 Hive 查询,客户端把 SQL 打包提交给 ResourceManager;
- RM 找一台空闲机器,分配一个小 Container 启动 ApplicationMaster(这条 SQL 的专属管理者);
- AM 解析 SQL,算出需要 20 个 Map 容器、5 个 Reduce 容器;
- AM 向 RM 批量申请 25 组内存 CPU 资源;
- RM 根据各节点空闲情况,分发资源到多台 NodeManager;
- NM 创建隔离容器,启动 Map 任务读取 Hive 表数据;
- Map 完成后启动 Reduce 做聚合统计;
- 任意 Map/Reduce 报错,AM 自动申请新容器重试;
- SQL 执行完毕,所有容器内存、CPU 全部回收,归还资源池给其他任务使用。

核心流转总结: 数据先通过 HDFS 完成分块 + 多副本存储(保障数据安全),计算任务由 YARN 统一调度资源,通过 Container 隔离运行,最终计算结果回写 HDFS,全程实现 “存储 - 计算 - 调度” 解耦。
五、YARN 不负责的工作边界
- 不管数据存储:文件、Hive 表存在 HDFS,YARN 只负责读取计算,不存数据;
- 不负责元数据:Hive 表结构、分区信息存在 MySQL 元数据库;
- 不负责分布式协调:主备切换、分l布式锁由 Zookeeper 负责;
- 不写计算逻辑:MapReduce/Spark 才是真正执行过滤、聚合的框架,YARN 只提供运行环境。
yarn的监控页面 http://linux02:8088/cluster

进入看到整个集群的监控,节点个数,节点状态,内存大小,总内存大小
在appllcations页面 作业监控
查看运行的作业
六、YARN 资源配置模板(xml)
<!-- 单台节点最大可分配内存,机器总内存预留20G给系统使用 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>184320</value>
</property>
<!-- 单个容器最小分配内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!-- 单个容器最大分配内存 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
七、YARN 运维常用命令
# 查看集群正在运行的所有任务
yarn application -list
# 强制终止卡住/失败的任务
yarn application -kill application_xxxx
# 查看所有NodeManager节点在线状态
yarn node -list -all
# 查看指定队列资源占用情况
yarn queue -status dw_queue
# 查看任务运行日志,排查OOM、报错
yarn logs -applicationId application_xxxx