一.简介
YARN(Yet Another Resource Negotiator)是一个通用的资源管理平台,可为各类计算框架提供资源的管理和调度。其核心出发点是为了分离资源管理与作业调度/监控,实现分离的做法是拥有一个全局资源管理器(ResourceManager,RM),以及每个应用程序对应一个应用管理器(ApplicationMaster,AM),应用程序由一个作业(Job)或者Job的有向无环图(DAG)组成。
功能
- 资源的统一管理和调度:集群中所有的节点资源(内存、CPU、磁盘、网络等)抽象为Container,Yarn按照特定的策略对资源进行调度进行Container的分配。
- 资源隔离:Yarn使用了轻量级资源隔离机制Cgroups进行资源隔离以避免相互干扰,一旦Container使用的资源超过事先定义的上限值,就将其杀死。
二.架构
图片来源官网
2.1 ResourceManager (RM)
RM是一个全局资源管理器,负责整个系统的资源管理和分配,它主要有两个组件构成:
- 调度器(Scheduler)
- 应用程序管理器:Applications Manager,ASM。
调度器
调度器根据容量,队列等限制条件(如某个分配一定资源,最多执行一定数量的作业等),将系统中资源分配给各个正在运行的应用程序。注意的是,该调度器是一个纯调度器,它不再从事任何与应用程序相关的工作,比如不负责重新启动(因应用程序失败或硬件故障导致的失败),这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念 资源容器(Resource Container,即Container),Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需求设计新的调度器,Yarn提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。
应用程序管理器
应用程序管理器负责整个系统中应用程序,包括应用程序提交、与调度器协商资源以AM、监控AM运行状态并在失败是重新启动它等。
2.2 NodeManager(NM)
NM是每个节点上运行的资源和任务管理器,一方面,它会定时向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一个方面,它接收并处理来自AM的Container启动/停止等各个请求。
2.3 ApplicationMaster(AM)
提交的每个作业都会包含一个AM,主要功能:
- 与RM协商以获取资源(用container表示);
- 将得到任务进一步分配给内部的任务;
- 与NM通信以启动/停止任务;
- 监控所有任务的运行状态,当任务有失败时,重新为任务申请资源并重启任务
MapReduce 就是原生支持 ON YARN 的一种框架,可以在 YARN 上运行 MapReduce 作业。有很多分布式应用都开发了对应的应用程序框架,用于在 YARN 上运行任务,例如 Spark,Storm、Flink 等。
2.4 Container
Container是Yarn中资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回资源便是用Container表示的。Yarn会为每个任务分配一个Container且该任务只能使用该Container中描述资源。
三.执行流程
当用户向Yarn中提交一个应用程序后,Yarn将分为两个阶段运行该应用程序:
- 启动ApplicationMaster
- ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。
(此图来自《Hadoop 技术内幕:深入解析 YARN 架构设计与实现原理》)
工作流程
- 用户向Yarn提交应用程序,其中包括ApplicationMaster程序,启动ApplicationMaster命令、用户程序等;
- RM为该应用程序分配第一个Container,并与对应的NM通信,要求它在这个Container中启动应用程序的ApplicationMaster;
- ApplicationMaster首先向RM注册,这样用户可以直接通过NM查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,一直重复下面4-7步;
- ApplicationMaster采用轮询的方式通过RPC协议向RM申请和领取资源;
- 一旦ApplicationMaster申请资源后,便与对应NM通信,要求它启动任务;
- NM为任务设置好运行环境(包括环境变量、jar包等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;
- 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
- 应用程序运行完成后,ApplicationMaster向RM注销并关闭自己(当然像 Storm、Flink 这种常驻应用程序列外)。
参考
https://matt33.com/2018/09/01/yarn-architecture-learn/
《Hadoop技术内幕 深入解析YARN架构设计与实现原理》