YARN 精讲

YARN是什么

Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

Hadoop2.0对MapReduce框架做了彻底的设计重构,我们称Hadoop2.0中的MapReduce为MRv2或者Yarn。在介绍Yarn之前,我们先回头看一下Hadoop1.x对MapReduce job的调度管理方式(可参考:Hadoop核心之MapReduce架构设计),它主要包括两部分功能:

1. ResourceManagement 资源管理

2. JobScheduling/JobMonitoring 任务调度监控

但是到了Hadoop2.x也就是Yarn,它的目标是将这两部分功能分开,也就是分别用两个进程来管理这两个任务:

1. ResourceManger

2. ApplicationMaster

需要注意的是,在Yarn中我们把job的概念换成了application,因为在新的Hadoop2.x中,运行的应用不只是MapReduce了,还有可能是其它应用如一个DAG(有向无环图Directed Acyclic Graph,例如storm应用)。Yarn的另一个目标就是拓展Hadoop,使得它不仅仅可以支持MapReduce计算,还能很方便的管理诸如Hive、Hbase、Pig、Spark/Shark等应用。这种新的架构设计能够使得各种类型的应用运行在Hadoop上面,并通过Yarn从系统层面进行统一的管理,也就是说,有了Yarn,各种应用就可以互不干扰的运行在同一个Hadoop系统中,共享整个集群资源,如下图所示: 

YARN 精讲

YRAN统一管理的优势

YARN是统一资源管理和调度。

MapReduce,Spark ,Storm等组件都会使用YARN管理的资源.

YARN在Hadoop生态系统中的位置

 YARN 精讲

YARN与MapReduce的区别

Yarn是一个资源的管理和调度框架,不是计算框架。

MapReduce是调度又是计算框架。

YARN产生背景

mapreduce1.0回顾

YARN 精讲

 

如果集群大了,性能就会下降,会出错!

MapReduce1.0的缺陷

扩展性差

JobTracker 同时兼备了资源管理和作业控制两个功能,中央集权严重制约了

Hadoop 集群扩展性。

 YARN 精讲

single point of failure(单点故障)

MRv1 采用了 master/slave 结构,其中master 存在单点故障问题,一旦它出现故障将导致整个集群不可用

 YARN 精讲

所以,要做HA,转到其他的节点,正常使用集群。

资源利用率低

MRv1 采用基于slot的粗粒度的资源分配模型,分为Map slot和Reduce slot,可由用户通过

mapreduce.tasktracker.map.tasks.maximum和mapreduce.tasktracker.reduce.tasks.maximum分别设置,默认分别为2

某个任务用不完的资源其他任务也不能用,map和reduce的资源也是完全不能共享的(比如一个作业刚刚提交时,只会运行Map Task,此时Reduce Slot 闲置)

 YARN 精讲

通用性差

随着互联网高速发展导致数据量剧增,MapReduce 这种基于磁盘的离线计算框架已经不能满足应用要求,从而出现了一些新的计算框架以应对各种场景,包括内存计算框架、流式计算框架和迭代式计算框架等,而MRv1 不能支持多种计算框架并存。

 YARN 精讲

YARN基本架构

整个Yarn的架构图

YARN 精讲

YARN 精讲

ResourceManage(RM)

RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。

 

ResourceManager负责集群资源的统一管理和调度,承担了 JobTracker

的角色,整个集群只有“一个”,总的来说,RM有以下作用:

1、处理客户端请求

2、启动或监控ApplicationMaster

3、监控NodeManager

4、资源的分配与调度

(1)调度器

调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。

需要注意的是,该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。

(2) 应用程序管理器

应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。

NodeManager(NM)

NM是每个节点上的资源和任务管理器,NodeManager管理YARN集群中的每个节点。NodeManager 提供针对集群中每个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。MRv1 通过slot管理 Map 和 Reduce 任务的执行,而 NodeManager 管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。NM有以下作用

1、管理单个节点上的资源

2、处理来自ResourceManager的命令

3、处理来自ApplicationMaster的命令

一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自AM的Container启动/停止等各种请求。

ApplicationMaster(AM)

每个应用有一个,负责应用程序的管理 。

ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过

NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配)。请注意,尽管目前的资源比较传统(CPU 核心、内存),但未来会带来支持的新资源类型(比如图形处理单元或专用处理设备)。

用户提交的每个应用程序均包含1个AM。

AM有以下作用:

1、负责数据的切分

2、为应用程序申请资源并分配给内部的任务

3、任务的监控与容错

与RM调度器协商以获取资源(用Container表示);

将得到的任务进一步分配给内部的任务;

与NM通信以启动/停止任务;

监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

当前YARN自带了两个AM实现,一个是用于演示AM编写方法的实例程序distributed shell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster.

Container

Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存

、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用

Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

需要注意的是,Container不同于MRv1中的slot,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。

Container有以下作用:

1. 对任务运行环境进行抽象,封装CPU、内存等多维度的资源以及环境变量、启动命令等任务运行相关的信息

YARN的工作流程

当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:

整个执行过程可以总结为三步:

1、应用程序提交

2、启动ApplicationMaster;

3、由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。

YARN 精讲

详细

YARN 精讲

YARN 精讲

详细步骤

步骤1:用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster、用户程序等。

步骤2:ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster。

步骤3:ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应     用程序的运行状态,然后它将为各个任务申请资源,并监控他的运行状态,直到运行结束,即要重复步骤4-7。

步骤4:ApplicationMaster采用轮询的方式通过RPC协议找ResourceManager申请和领取资源。  

步骤5:一旦Application申请到资源后,便与对应的NodeManager通信,要求启动任务。

步骤6:NodeManager为任务设置好运行环境,包括环境变量、JAR包、二进制程序等,然后将任务启动命令写到另一个脚本中,并通过运行该脚本启动任务。

步骤7:各个任务通过RPC协议向ApplicationMaster汇报自己的状态和进度,ApplicationMaster随时掌握各个      任务的运行状态,从而可以再任务失败时重新启动任务。在应用程序运行过程中,用户可以随时通过RPC协议

ApplicationMaster查询应用程序的当前运行状态。

步骤8:应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

YARN HA

HA:主要解决单点故障的问题

YARN 精讲

YARN 精讲

在hadoop2.X中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。

完成安装zookeeper集群:主要作用是用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态。

 YARN 精讲

YARN容错性

ResourceManager

基于ZooKeeper实现HA。

详解 ZooKeeper实现HA

 

https://blog.****.net/WYpersist/article/details/79814198

官网:

http://hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

NodeManager

失败后,RM将失败任务告诉对应的AM;

AM决定如何处理失败的任务。

ApplicationMaster

失败后,由RM负责重启;

AM需处理内部任务的容错问题;

RMAppMaster会保存已经运行完成的Task,重启后无需重新运行。

MapReduce2.0与YARN

YARN和MapReduce的关系—由hadoop1.0到hadoop2.0的变迁说起

 YARN 精讲

YARN是一个资源管理系统,负责资源管理和调度

MapReduce只是运行在YARN上的一个应用程序

如果把YARN看做“android”,则MapReduce只是一个“app”

 MapReduce 1.0与MapReduce 2.0

MapReduce 1.0是一个独立的系统,直接运行在Linux之上

MapReduce 2.0则是运行YARN上的框架,且可与多种框架一起运行在YARN上

YARN调度器(Scheduler)

理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。

在Yarn中,负责给应用分配资源的就是Scheduler

其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。为此,Yarn提供了多种调度器和可配置的策略供我们选择。

FIFO Scheduler(先进先出调度器)

1. 先提交的作业,就先执行

2. 有一个缺点:不能在共享集群里面用,所以就说不能在YRAN里面调度方式,但是可以在每一个调度器里面使用的。

 YARN 精讲

Capacity Scheduler(容量调度器)

YARN 精讲

FairS cheduler(公平调度器)

1. 公平调度器,就是能够共享整个集群的资源

2. 不用预先占用资源,每一个作业都是共享的

3. 每当提交一个作业的时候,就会占用整个资源。如果再提交一个作业,那么第一个作业就会分给第二个作业一部分资源,第一个作业也就释放一部分资源。再提交其他的作业时,也同理。。。。也就是说每一个作业进来,都有机会获取资源。

 YARN 精讲

资源:resource Scheduler

Fair Scheduler与Capacity Scheduler不同之处主要体现在以下几个方面:

· 资源公平共享:在每个队列中,Fair Scheduler可选择按照FIFO、Fair或DRF策略为应用程序分配资源。Fair策略即平均分配,默认情况下,每个队列采用该方式分配资源

· 支持资源抢占:当某个队列中有剩余资源时,调度器会将这些资源共享给其他队列,而当该队列中有新的应用程序提交时,调度器要为它回收资源。为了尽可能降低不必要的计算浪费,调度器采用了先等待再强制回收的策略,即如果等待一段时间后尚有未归还的资源,则会进行资源抢占;从那些超额使用资源的队列中杀死一部分任务,进而释放资源

· 负载均衡:Fair Scheduler提供了一个基于任务数的负载均衡机制,该机制尽可能将系统中的任务均匀分配到各个节点上。此外,用户也可以根据自己的需求设计负载均衡机制

· 调度策略灵活配置:Fiar Scheduler允许管理员为每个队列单独设置调度策略(当前支持FIFO、Fair或DRF三种)

· 提高小应用程序响应时间:由于采用了最大最小公平算法,小作业可以快速获取资源并运行完成

详解调度器

https://blog.****.net/WYpersist/article/details/79814152

并行编程角度理解YARN

可将YARN看做一个云操作系统,它负责为应用程序启动ApplicationMaster(相当于主线程),然后再由ApplicationMaster负责数据切分、任务分配、启动和监控等工作,而由ApplicationMaster启动的各个Task(相当于子线程)仅负责自己的计算任务。当所有任务计算完成后,ApplicationMaster认为应用程序运行完成,然后退出。

YARN 精讲