Hadoop 系列YARN:资源调度平台(YARN介绍)
YARN介绍
YARN的全称是Yet Another Resource Negotiator,意为另一种资源调度者。 从Apache Hadoop 2.0开始, Hadoop包含 YARN。
Hadoop 1.x与Hadoop 2.x
(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。
(3)YARN
YARN是Hadoop 2.x中的资源管理系统,它是一个通用的资源管理模块,可为各类应用程序进行资源管理和调度。YARN不仅限于MapReduce一种框架使用,也可以供其他框架使用,比如Hive、Spark、Storm等。由于YARN的通用性,下一代MapReduce的核心已经从简单的支持单一应用的计算框架MapReduce转移到通用的资源管理系统YARN。
为了让大家更进一步理解以 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的架构
YARN的架构还是经典的主从(master/slave)结构,如下图所示。大体上看,YARN服务由一个ResourceManager(RM)和多个NodeManager(NM)构成,ResourceManager为主节点(master),NodeManager为从节点(slave)。
简单地说,YARN 主要由 ResourceManager、NodeManager、ApplicationMaster和 Container 等几个组件构成。
Container是Yarn对计算机计算资源的抽象,它其实就是一组CPU和内存资源,所有的应用都会运行在Container中。
ApplicationMaster是对运行在Yarn中某个应用的抽象,它其实就是某个类型应用的实例,ApplicationMaster是应用级别的,它的主要功能就是向ResourceManager(全局的)申请计算资源(Containers)并且和NodeManager交互来执行和监控具体的task。
Scheduler是ResourceManager专门进行资源管理的一个组件,负责分配NodeManager上的Container资源,NodeManager也会不断发送自己Container使用情况给ResourceManager。
(1)ResourceManager(RM)
RM 是一个全局的资源管理器,负责整个系统的资源管理和分配。RM有两个主要组件:调度器(Scheduler)和应用程序管理器(Applications Manager)。
调度器(Scheduler),负责根据容量,队列等的熟悉约束,向各种运行的应用程序分配资源。调度程序是纯调度器,它不执行监视或跟踪应用程序的状态。此外,由于应用程序故障或硬件故障,它不能保证重新启动失败的任务。调度程序根据应用程序的资源需求执行其调度功能; 它基于包含诸如内存,cpu,磁盘,网络等元素的资源容器的抽象概念。YARN 提供了多种直接可用的调度器,比如 FairScheduler 和 Capacity Scheduler 等。
ApplicationsManager负责接受作业提交,协商第一个容器来执行应用程序特定的ApplicationMaster,并提供服务,以便在失败时重新启动ApplicationMaster容器。每个应用程序ApplicationMaster有责任从调度程序协商适当的资源容器,跟踪其状态并监视进度。
(2) ApplicationMaster ( AM )
当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster(AM),它负责向 ResourceManager 申请资源,并要求 NodeManger 启动可以占用一定资源的任务。
AM主要功能包括:
与 RM 调度器协商以获取资源(用 Container 表示);
将得到的任务进一步分配给内部的任务;
与 NM 通信以启动 / 停止任务;
监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
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 进行资源隔离。
YARN工作流程
了解了上面介绍的这些概念,我们有必要看一下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也归还给系统