一、 产生背景

Hadoop 1.X时期,MapReduce采用的也是主从架构:即master-slaves架构,一个JobTracker带多个TaskTracker。JobTracker:负责资源管理和作业调度;Tasktracker 向jobtracker定期汇报本节点的健康状况、资源使用情况、作业执行情况;同时也接收来自JobTracker的命令,负责启动和杀死任务的具体执行。MapReduce作业拆分成Map任务和Task任务,由TaskTracker负责执行和汇报。
这样的架构存在天生的缺陷:

  1. MapReduce同时身兼两职:既是计算框架,同时又是资源管理系统。
  2. 其主要角色JobTracker既做资源管理,又做任务调度,任务太重,开销过大,同时存在单点故障。
    • JobTracker既要维护job的状态又要维护job的task的状态,造成资源消耗过多
  3. 不仅如此,早期的MR的资源描述模型过于简单,导致资源利用率较低
    • 它仅把Task数量看作资源,没有考虑CPU和内存
    • 强制把资源分成Map Task Slot和Reduce Task Slot,仅仅只能支持MR作业,不能支持其他计算框架(如Spark、Storm等)
  4. MR还存在扩展性较差(集群规模上限4K)
  5. 源码难以理解,升级维护困难
  6. 难以统一管理多个集群(如Spark集群,hadoop集群同时存在),资源利用率较低,彼此之间没有办法共享资源,运维成本高。

于是Hadoop在1.0升级到2.0的过程中,便将JobTracker的资源调度工作独立了出来,这个独立出来的资源管理框架,就是Yarn。

二、 YARN设计目标

  • YARN,Yet Another Resource Negotiator,另一种资源管理器
  • 定位是 分布式通用资源管理系统
  • 设计目标:聚焦资源管理、通用(适用各种计算框架)、高可用、高扩展
  • YARN在大数据生态中的位置,位于HDFS之上,多种计算框架、数据分析框架等应用程序之下,这样多种不同类型的计算框架都可以运行在同一个集群里面,共享同一个HDFS集群上的数据,享受整体的资源调度。也就是 XXX on YARN,例如Spark on YARN,Spark on YARN,MapReduce on Yarn,Storm on YARN,Flink on YARN。好处是与其他计算框架共享集群资源,按自愿需要分配,进而提高集群资源的利用率。

三、 YARN架构

3.1 系统架构

3.1.1 基本思想

  • Master/Slave架构
  • 将JobTracker的资源管理、任务调度功能分离
  • 三种角色:ResourceManager(Master)、NodeManager(Slave)、ApplicationMaster (新角色)

3.1.2 核心概念

1)ResourceManager(RM)

  1. 主要功能:
  • 统一管理集群的所有资源
  • 将资源按照一定策略分配给各个应用(ApplicationMaster)
  • 接收NodeManager的资源上报信息
  1. 核心组件
  • 用户交互服务(User Service)
  • NodeManager管理
  • ApplicationMaster管理
  • Application管理
  • 定时调用器(Scheduler)
  • 安全管理
  • 资源管理

2)NodeManager(NM)

  1. 主要功能
  • 管理单个节点的资源
  • 向ResourceManager汇报节点资源使用情况
  • 管理Container的生命周期
  1. 核心组件
  • NodeStatusUpdater
  • ContainerManager
  • ContainerExecutor
  • NodeHealthCheckerService
  • Security
  • WebServer

3)ApplicationMaster(AM)

  1. 主要功能
  • 管理应用程序实例
  • 向ResourceManager申请任务执行所需的资源
  • 任务调度和监管
  1. 实现方式
  • 需要为每个应用开发一个AM组件
  • YARN提供MapReduce的ApplicationMaster实现
  • 采用基于事件驱动的异步编程模型,由中央事件调度器统一管理所有事件
  • 每种组件都是一种事件处理器,在中央事件调度器中注册

4)Container

  • 概念:Container封装了节点上进程的相关资源,是YARN中资源的抽象
  • 分类:运行ApplicationMaster的Container、运行应用任务的Container
  • Yarn 将CPU核数,内存这些计算资源都封装成为一个个的容器(Container)。需要注意两点:
    1. 容器Container由 NodeManager 启动和管理,并被它所监控。
    2. 容器Container被 ResourceManager 进行调度

3.1.3 工作机制

  1. 客户端提交Task请求到RM
  2. RM先到NM上启动1个Container,用来运行AM,并监控AM
  3. AM启动后,向RM注册(任务是由AM管理的,注册之后,用户就可以通过RM查询AM上的作业进度)并向NM申请资源(Core Memory),申请资源,RM给AM分配响应的NM资源
  4. AM下发指令给相应的的NM,与NM协调分配Container,NM启动Container,启动并运行task

3.2 高可用

ResourceManager高可用

  • 一个Active RM,多个Standby RM
  • Active RM宕机后自动实现主备切换
  • Zookeeper的核心作用:
    1. Active节点选举
    2. 恢复Active RM的原有状态信息
  • 重启AM,杀死所有运行中的Container
  • 切换方式:手动、自动

四、 YARN资源调度策略

4.1 FIFO调度器

FIFO Scheduler(先进先出调度器)
调度策略

  • 将所有任务放入一个队列,先进队列的先获得资源,排在后面的任务只有等待。

缺点

  1. 资源利用率差,无法交叉运行任务
  2. 灵活性差,如:紧急任务无法插队,耗时长的任务拖慢耗时短的任务

4.2 容量调度器

Capacity Scheduler(容量调度器)
核心思想

  • 提前做预算,在预算指导下分享集群资源

调度策略

  • 集群资源由多个队列分享
  • 每个队列都要预设资源分配的比例(提前做预算)
  • 空闲资源优先分配给“实际资源/预算资源”比值最低的队列
  • 队列内部采用FIFO调度策略

特点

  • 层次化的队列设计:子队列可使用父队列资源
  • 容量保证:每个队列都要预设资源占比,防止资源独占
  • 弹性分配:空闲资源可以分配给任何队列,当多个队列争用时,会按比例进行平衡
  • 支持动态管理:可以动态调整队列的容量、权限等参数,也可动态增加、暂停队列
  • 访问控制:用户只能向自己的队列中提交任务,不能访问其他队列
  • 多租户:多用户共享集群资源

4.3 公平调度器

Fair Scheduler(公平调度器)
调度策略

  • 多队列公平共享集群资源
  • 通过平分的方式,动态分配资源,无需预先设定资源分配比例
  • 队列内部可配置调度策略:FIFO、Fair(默认)

资源抢占

  • 终止其他队列的任务,使其让出所占资源,然后将资源分配给占用资源量少于最小资源量限制的队列

队列权重

  • 当队列中有任务等待,并且集群中有空闲资源时,每个队列可以根据权重获得不同比例的空闲资源

五、 YARN运维与监控

5.1 YARN运维

Shell命令: yarn application [command_options]
command_options如-list、-kill、-status

Kill任务

  • CTRL+C不能终止任务,只是停止其在控制台的信息输出,任务仍在集群中运行
  • 正确方法:先使用yarn application -list获取进程号,再使用-kill终止任务

5.2 YARN监控

  • 访问Resource Manager的8088端口,进入监控页面

六、 综述

(一)
YARN 是 Hadoop 2.0 中的资源管理系统,基本设计思想是将 JobTracker 拆分成了两个独立的服务:一 个全局的资源管理器 ResourceManager 和每个应用程序特有的 ApplicationMaster。其中 ResourceManager 负责整个系统的资源管理和分配,而 ApplicationMaster 负责单个应用程序的管理。
YARN 总体上仍然是 master/slave 结构,在整个资源管理框架中,ResourceManager 为 master, NodeManager 是 slave。Resourcemanager 负责对各个 NodeManager 上资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的 ApplicationMaster,它负责向 ResourceManager 申请资源,并要求 NodeManger 启动可以占用一定资源的任务。由于不同的 ApplicationMaster 被分布到不同的节点上,因此它们之间不会相互影响。
YARN 的基本组成结构:YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等几个组件构成。

  • ResourceManager 是 Master 上一个独立运行的进程,负责集群统一的资源管理、调度、分配等等;
  • NodeManager 是 Slave 上一个独立运行的进程,负责上报节点的状态;
  • Application Master 和 Container 是运行在 Slave 上的组件,Container 是 YARN 中分配资源的一个单位,包涵内存、CPU YARN 以 Container 为单位分配资源。
    Client 向 ResourceManager 提交的每一个应用程序都必须有一个 Application Master,它经过 ResourceManager 分配资源后,运行于某一个 Slave 节点的 Container 中,具体做事情的 Task,同样也运行与某一个 Slave 节点的 Container 中。RM,NM,AM 乃至普通的 Container 之间的通信,都是用 RPC 机制。
    YARN 的架构设计使其越来越像是一个云操作系统,数据处理操作系统。

(二)
当用户向 YARN 中提交一个应用程序后,YARN 将分两个阶段运行该应用程序: 第一个阶段是启动 ApplicationMaster; 第二个阶段是由 ApplicationMaster 创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。 如下图所示,YARN 的工作流程分为以下几个步骤:

  1. 用户向 YARN 中提交应用程序,其中包括ApplicationMaster 程序、启动 ApplicationMaster 的命令、用户程序等。
  2. ResourceManager 为该应用程序分配第一个 Container,并与对应的 NodeManager 通信,要求它在这个 Container 中启动应用程序的 ApplicationMaster。
  3. ApplicationMaster 首先向 ResourceManager 注册,这样用户可以直接通过 ResourceManager 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤 4~7。
  4. ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。
  5. 一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务。
  6. NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
  7. 各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过 RPC 向 ApplicationMaster 查询应用程序的当前运行状态。
  8. 应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。

参考资料

[1]让 Hadoop 称霸至今的框架 –Hadoop Yarn
[2]分布式资源管理器YARN简介(一)
[3]分布式资源管理系统:YARN
[4]YARN 分布式资源调度