转:yarn详解

背景

Yarn是一个分布式的资源管理系统,用以提升分布式的集群环境下的资源利用率,这些资源包括内存、IO、网络、磁盘等。其产生的缘由是为了解决原MapReduce框架的不足。最初MapReducecommitter们还能够周期性的在已有的代码上进行修改,但是随着代码的增长以及原MapReduce框架设计的不足,在原MapReduce框架上进行修改变得愈来愈困难,因此MapReducecommitter们决定从架构上从新设计MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具备更好的扩展性、可用性、可靠性、向后兼容性和更高的资源利用率以及能支持除了MapReduce计算框架外的更多的计算框架。html

MapReduce框架的不足

l  JobTracker是集群事务的集中处理点,存在单点故障node

l  JobTracker须要完成的任务太多,既要维护job的状态又要维护jobtask的状态,形成过多的资源消耗apache

l  taskTracker端,用map/reduce task做为资源的表示过于简单,没有考虑到cpu、内存等资源状况,当把两个须要消耗大内存的task调度到一块儿,很容易出现OOM网络

l  把资源强制划分为map/reduce slot,当只有map task时,reduce slot不能用;当只有reduce task时,map slot不能用,容易形成资源利用不足。架构

 

Yarn架构

                                         yarn详解

Yarn/MRv2最基本的想法是将原JobTracker主要的资源管理和job调度/监视功能分开做为两个单独的守护进程。有一个全局的ResourceManager(RM)和每一个Application有一个ApplicationMaster(AM)Application至关于map-reduce job或者DAG jobsResourceManagerNodeManager(NM)组成了基本的数据计算框架。ResourceManager协调集群的资源利用,任何client或者运行着的applicatitonMaster想要运行job或者task都得向RM申请必定的资源。ApplicatonMaster是一个框架特殊的库,对于MapReduce框架而言有它本身的AM实现,用户也能够实现本身的AM,在运行的时候,AM会与NM一块儿来启动和监视tasksapp

 

ResourceManager

ResourceManager做为资源的协调者有两个主要的组件:SchedulerApplicationsManager(AsM)框架

Scheduler负责分配最少但知足application运行所需的资源量给ApplicationScheduler只是基于资源的使用状况进行调度,并不负责监视/跟踪application的状态,固然也不会处理失败的taskRM使用resource container概念来管理集群的资源,resource container是资源的抽象,每一个container包括必定的内存、IO、网络等资源,不过目前的实现只包括内存一种资源。分布式

ApplicationsManager负责处理client提交的job以及协商第一个container以供applicationMaster运行,而且在applicationMaster失败的时候会从新启动applicationMaster。下面阐述RM具体完成的一些功能。oop

 

一、  资源调度url

Scheduler从全部运行着的application收到资源请求后构建一个全局的资源分配计划,而后根据application特殊的限制以及全局的一些限制条件分配资源。

二、  资源监视

Scheduler会周期性的接收来自NM的资源使用率的监控信息,另外applicationMaster能够从Scheduler获得属于它的已完成的container的状态信息。

三、  application提交

l  clientAsM得到一个applicationID

l  clientapplication定义以及须要的jar包文件等上传到hdfs的指定目录,由yarn-site.xmlyarn.app.mapreduce.am.staging-dir指定

l  client构造资源请求的对象以及application的提交上下文发送给AsM

l  AsM接收application的提交上下文

l  AsM根据application的信息向Scheduler协商一个ContainerapplicationMaster运行,而后启动applicationMaster

l  向该container所属的NM发送launchContainer信息启动该container,也即启动applicationMaster

l  AsMclient提供运行着的AM的状态信息。

四、  AM的生命周期

AsM负责系统中全部AM的生命周期的管理。AsM负责AM的启动,当AM启动后,AM会周期性的向AsM发送heartbeat,默认是1sAsM据此了解AM的存活状况,而且在AM失败时负责重启AM,如果必定时间事后(默认10分钟)没有收到AMheartbeatAsM就认为该AM失败了。

 

关于ResourceManager的可用性目前尚未很好的实现,不过Cloudera公司的CDH4.4之后的版本实现了一个简单的高可用性,使用了Hadoop-common项目中HA部分的代码,采用了相似hdfs namenode高可用性的设计,给RM引入了activestandby状态,不过没有与journalnode相对应的角色,只是由zookeeper来负责维护RM的状态,这样的设计只是一个最简单的方案,避免了手动重启RM,离真正的生产可用还有一段距离。

NodeManager

NM主要负责启动RM分配给AMcontainer以及表明AMcontainer,而且会监视container的运行状况。在启动container的时候,NM会设置一些必要的环境变量以及将container运行所需的jar包、文件等从hdfs下载到本地,也就是所谓的资源本地化;当全部准备工做作好后,才会启动表明该container的脚本将程序启动起来。启动起来后,NM会周期性的监视该container运行占用的资源状况,如果超过了该container所声明的资源量,则会kill掉该container所表明的进程。

另外,NM还提供了一个简单的服务以管理它所在机器的本地目录。Applications能够继续访问本地目录即便那台机器上已经没有了属于它的container在运行。例如,Map-Reduce应用程序使用这个服务存储map output而且shuffle它们给相应的reduce task

NM上还能够扩展本身的服务,yarn提供了一个yarn.nodemanager.aux-services的配置项,经过该配置,用户能够自定义一些服务,例如Map-Reduceshuffle功能就是采用这种方式实现的。

NM在本地为每一个运行着的application生成以下的目录结构:

yarn详解

 

Container目录下的目录结构以下:

yarn详解

 

在启动一个container的时候,NM就执行该containerdefault_container_executor.sh,该脚本内部会执行launch_container.shlaunch_container.sh会先设置一些环境变量,最后启动执行程序的命令。对于MapReduce而言,启动AM就执行org.apache.hadoop.mapreduce.v2.app.MRAppMaster;启动map/reduce task就执行org.apache.hadoop.mapred.YarnChild

ApplicationMaster

   ApplicationMaster是一个框架特殊的库,对于Map-Reduce计算模型而言有它本身的applicationMaster实现,对于其余的想要运行在yarn上的计算模型而言,必须得实现针对该计算模型的applicaitonMaster用以向RM申请资源运行task,好比运行在yarn上的spark框架也有对应的applicationMaster实现,归根结底,yarn是一个资源管理的框架,并非一个计算框架,要想在yarn上运行应用程序,还得有特定的计算框架的实现。因为yarn是伴随着MRv2一块儿出现的,因此下面简要概述MRv2yarn上的运行流程。

 

MRv2运行流程:

一、  MR JobClientresourceManager(AsM)提交一个job

二、  AsMScheduler请求一个供MR AM运行的container,而后启动它

三、  MR AM启动起来后向AsM注册

四、  MR JobClientAsM获取到MR AM相关的信息,而后直接与MR AM进行通讯

五、  MR AM计算splits并为全部的map构造资源请求

六、  MR AM作一些必要的MR OutputCommitter的准备工做

七、  MR AMRM(Scheduler)发起资源请求,获得一组供map/reduce task运行的container,而后与NM一块儿对每个container执行一些必要的任务,包括资源本地化等

八、  MR AM 监视运行着的task 直到完成,当task失败时,申请新的container运行失败的task

九、  当每一个map/reduce task完成后,MR AM运行MR OutputCommittercleanup 代码,也就是进行一些收尾工做

10、当全部的map/reduce完成后,MR AM运行OutputCommitter的必要的job commit或者abort APIs

11MR AM退出。

 

 

Yarn上写应用程序     

    yarn上写应用程序并不一样于咱们熟知的MapReduce应用程序,必须牢记yarn只是一个资源管理的框架,并非一个计算框架,计算框架能够运行在yarn上。咱们所能作的就是向RM申请container,而后配合NM一块儿来启动container。就像MRv2同样,jobclient请求用于MR AM运行的container,设置环境变量和启动命令,而后交由NM去启动MR AM,随后map/reduce task就由MR AM全权负责,固然task的启动也是由MR AMRM申请container,而后配合NM一块儿来启动的。因此要想在yarn上运行非特定计算框架的程序,咱们就得实现本身的clientapplicationMaster。另外咱们自定义的AM须要放在各个NMclasspath下,由于AM可能运行在任何NM所在的机器上。

 

原文来自于:http://blog.sina.com.cn/s/blog_829a682d0101lc9d.html