YARN的全称是Yet Another Resource Negotiator,意为另一种资源调度者。 从Apache Hadoop 2.0开始, Hadoop包含 YARN。
(1)MRv1
在介绍Yarn之前,我们先回头看一下Hadoop1.x对MapReduce job的调度管理方式。在Hadoop 1.x版本中,MapReduce(也称MRv1)既要负责资源管理又要负责作业处理。MapReduce(MRv1)运行时环境由(一个)JobTracker和(若干个)TaskTracker两类服务组成。其中,JobTracker负责资源管理和所有作业的控制,而TaskTracker负责接收来自JobTracker的命令并执行它。该框架在扩展性、容错性和多框架支持等方面存在不足,这也促使了MRv2的产生。
(2)MRv2
在Apache Hadoop 2.x中,我们将MapReduce(MRv1)分解为Apache Hadoop YARN,一种通用的分布式应用程序管理框架,而Apache Hadoop MapReduce(又称MRv2)仍然是一个纯粹的分布式计算框架。
MRv2是在运行于资源管理框架YARN之上的计算框架MapReduce。它的运行时环境不再由JobTracker和TaskTracker等服务组成,而是变为通用资源管理系统YARN和作业控制进程ApplicationMaster。 简言之,MRv1仅是一个独立的离线计算框架,而MRv2则是运行于YARN之上的MapReduce。
为了让大家更进一步理解以 YARN 为核心的软件栈(Hadoop 2.x),我们将与以 MapReduce 为核心的软件栈(Hadoop 1.x)进行对比,如下图。在Yarn中我们把job的概念换成了application,因为在新的Hadoop2.x中,运行的应用不只是MapReduce了,还有可能是其它应用如一个DAG(有向无环图Directed Acyclic Graph,例如storm应用)。Yarn的另一个目标就是拓展Hadoop,使得它不仅仅可以支持MapReduce计算,还能很方便的管理诸如Hive、Hbase、Pig、Spark/Shark等应用。
Hadoop 2.x的YARN已经不再局限于支持MapReduce 一种计算框架,而是朝着对多种框架进行统一管理的方向发展。
YARN的架构还是经典的主从(master/slave)结构,如下图所示。大体上看,YARN服务由一个ResourceManager(RM)和多个NodeManager(NM)构成,ResourceManager为主节点(master),NodeManager为从节点(slave)。
简单地说,YARN 主要由 ResourceManager、NodeManager、ApplicationMaster和 Container 等几个组件构成。
(1)ResourceManager(RM)
RM 是一个全局的资源管理器,负责整个系统的资源管理和分配。RM有两个主要组件:调度器(Scheduler)和应用程序管理器(Applications Manager)。
(2) ApplicationMaster ( AM )
当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster(AM),它负责向 ResourceManager 申请资源,并要求 NodeManger 启动可以占用一定资源的任务。
AM主要功能包括:
ApplicationMaster 负责一个应用程序生命周期内的所有工作。但注意每一个 应用程序(不是每一种)都有一个 ApplicationMaster,它可以运行在 ResourceManager 以外的机器上。
(3)NodeManager ( NM )
NM 是每个节点上的资源和任务管理器,一方面,它会定时地向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态;另一方面,它接收并处理来自 AM 的 Container启动 / 停止等各种请求。
NM 功能比较专一,就是负责 Container 状态的维护,并向 RM 保持心跳。
(4)Container
Container 是 YARN 中 的 资 源 抽 象, 它 封 装 了 某 个 节 点 上 的 多 维 度 资 源, 如 内 存、CPU、磁盘、网络等,当 AM 向 RM 申请资源时,RM 为 AM 返回的资源便是用 Container表示的。YARN 会为每个任务分配一个 Container,且该任务只能使用该 Container 中描述的资源。需要注意的是,Container 不同于 MRv1 中的 slot,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。目前,YARN 仅支持 CPU 和内存两种资源,且使用了轻量级资源隔离机制 Cgroups 进行资源隔离。
了解了上面介绍的这些概念,我们有必要看一下Application在Yarn中的执行过程。当用户向 YARN 中提交一个应用程序后,YARN 将分两个阶段运行该应用程序 :第一个阶段是启动 ApplicationMaster ;第二个阶段是由 ApplicationMaster 创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。
(1)客户端程序向ResourceManager提交应用并请求一个ApplicationMaster实例
(2)ResourceManager找到可以运行一个Container的NodeManager,并在这个Container中启动ApplicationMaster实例
(3)ApplicationMaster向ResourceManager进行注册,注册之后客户端就可以查询ResourceManager获得自己ApplicationMaster的详细信息,以后就可以和自己的ApplicationMaster直接交互了
(4)在平常的操作过程中,ApplicationMaster根据resource-request协议向ResourceManager发送resource-request请求
(5)当Container被成功分配之后,ApplicationMaster通过向NodeManager发送container-launch-specification信息来启动Container, container-launch-specification信息包含了能够让Container和ApplicationMaster交流所需要的资料
(6)应用程序的代码在启动的Container中运行,并把运行的进度、状态等信息通过application-specific协议发送给ApplicationMaster
(7)在应用程序运行期间,提交应用的客户端主动和ApplicationMaster交流获得应用的运行状态、进度更新等信息,交流的协议也是application-specific协议
(8)一但应用程序执行完成并且所有相关工作也已经完成,ApplicationMaster向ResourceManager取消注册然后关闭,用到所有的Container也归还给系统