欢迎来到安国润的个人网站

YARN 分布式资源管理系统

返回列表

YARN 分布式资源管理系统

一、YARN 简介

前提:hadoop1.x版本是没有yarn,由一个节点负责计算框架和资源管理框架,分发任务到其他节点,同时实时汇报这个节点。比较简单,这个节点任务重,不具备高可用,单点故障高,同时资源管理太简单了,这考虑任务task个数,不考虑硬件资源,没有考虑一些作业是很消耗资源的。

hadoop2.x 提出了yarn

YARN = Hadoop 集群的操作系统 / 资源大管家/ 分布式通用资源管理系统

整个集群所有机器的 CPU、内存、磁盘 IO、网络带宽全部统一收归 YARN 管理;

可以将(Hive、Spark、MapReduce、Flink 离线、自己编写的任务)的作业调度到hdfs上运行,

由 YARN 分配资源、管控运行、回收资源。

yarn在大数据的位置

1782438219602

二、YARN 架构

1782438449869

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 工作机制

1782439616945

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个全部释放掉

作业结束。

1782440458144

yarn的高可用是又多台主节点实现的,这些主节点的状态由zookeeper进行管理切换的,从所有主节点选举一个做管理节点,管理节点挂了,zookeeper会选举产生新的管理节点,管理节点的元数据同步直接放在zookeeper里,新选举的管理节点从zookeeper中同步元数据信息,实现集群的管理。

在管理节点挂了后,任务会阻塞,等待产生新的管理节点

三、YARN 四大核心能力

1. 统一管理全集群硬件资源(CPU / 内存)

  1. 每台服务器上的 NodeManager 会上报本机可用内存、CPU 核心数;
  2. ResourceManager 汇总所有机器资源,形成全局资源池;
  3. 硬性隔离:不同任务之间内存、CPU 互不抢占,一个任务爆内存不会把整台机器拖垮。

  4. 举例:一台机器 256G 内存,系统预留 20G,剩余 236G 全部交给 YARN 分配给任务容器。

2. 接收所有计算任务,分配运行资源(Container)

任何计算程序(Hive SQL、Spark、MR)提交给 YARN 后:

  1. YARN 先分配一小块容器启动任务总管 AM;

  2. AM 再向 RM 申请多份容器,用来跑 Map、Reduce、Spark Task;

  3. 每个容器固定分配内存 + CPU,比如 4G 内存 1 核、8G 内存 2 核。

    没有 YARN:程序自己抢占机器资源,多个任务并发直接 OOM、机器卡死。

3. 全程监控任务运行,故障自动重试

  1. NodeManager 实时监控本机所有容器进程;
  2. 容器崩溃、内存超限、节点宕机,立刻上报 RM;
  3. AM 收到失败信号后,自动向 RM 申请新容器,重新执行失败分片;
  4. 记录任务运行日志,支持事后排查报错。

  5. 收拢全集群机器的内存、CPU 资源;

  6. 给每一个计算任务分配独立隔离的容器;
  7. 监控任务死活,失败自动重试;
  8. 多业务队列公平调度,保障核心业务资源。

四、Hive SQL 完整 YARN 执行流程

  1. 你执行 Hive 查询,客户端把 SQL 打包提交给 ResourceManager;
  2. RM 找一台空闲机器,分配一个小 Container 启动 ApplicationMaster(这条 SQL 的专属管理者);
  3. AM 解析 SQL,算出需要 20 个 Map 容器、5 个 Reduce 容器;
  4. AM 向 RM 批量申请 25 组内存 CPU 资源;
  5. RM 根据各节点空闲情况,分发资源到多台 NodeManager;
  6. NM 创建隔离容器,启动 Map 任务读取 Hive 表数据;
  7. Map 完成后启动 Reduce 做聚合统计;
  8. 任意 Map/Reduce 报错,AM 自动申请新容器重试;
  9. SQL 执行完毕,所有容器内存、CPU 全部回收,归还资源池给其他任务使用。

1782359997776

核心流转总结: 数据先通过 HDFS 完成分块 + 多副本存储(保障数据安全),计算任务由 YARN 统一调度资源,通过 Container 隔离运行,最终计算结果回写 HDFS,全程实现 “存储 - 计算 - 调度” 解耦。

五、YARN 不负责的工作边界

  1. 不管数据存储:文件、Hive 表存在 HDFS,YARN 只负责读取计算,不存数据;
  2. 不负责元数据:Hive 表结构、分区信息存在 MySQL 元数据库;
  3. 不负责分布式协调:主备切换、分l布式锁由 Zookeeper 负责;
  4. 不写计算逻辑:MapReduce/Spark 才是真正执行过滤、聚合的框架,YARN 只提供运行环境。

yarn的监控页面 http://linux02:8088/cluster

1782441116007

进入看到整个集群的监控,节点个数,节点状态,内存大小,总内存大小

在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