1、YARN背景介绍
YARN是在MRv1基础上演化而来的,它克服了MRv1的各种局限性。相比于YARN,MRv1的局限性可概括为如下几个方面:
扩展性差。在MRv1中,JobTracker同时兼备了资源管理和作业控制两个功能,这成为系统的一个最大瓶颈,严重制约了Hadoop集群的扩展性;
可靠性差。MRv1采用了master/slave结构,其中,master存在单点故障问题,一旦它出现故障将导致整个集群不可用;
资源利用率低。MRv1采用了基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完槽位对应的资源,且其他任务也无法使用这些空闲资源。此外,Hadoop将槽位分为Map Slot和Reduce Slot两种,且不允许它们之间共享,常常会导致一种槽位资源紧张而另外一种闲置(比如一个作业刚刚提交时,只会运行Map Task,此时Reduce Slot闲置);
无法支持多种计算框架。随着互联网的高度发展,MapReduce这种基于磁盘的离线计算框架已经不能满足应用要求,从而出现了一些新的计算框架,包括内存计算框架、流式计算框架和迭代式计算框架等,而MRv1不能支持多种计算框架并存。
为了克服以上几个缺点,Apache开始尝试对Hadoop进行升级改造,进而诞生了更加先进的下一代MapReduce计算框架MRv2。正式由于MRv2将资源管理功能抽象成了一个独立的通用系统YARN,直接导致下一代MapReduce的核心从单一的计算框架MapReduce转移为通用的资源管理系统YARN。下图展示了以MapReduce为核心的软件栈与以YARN为核心的软件栈的对比情况,在以MapReduce为核心的软件栈中,资源管理系统YARN是可插拔替换的,比如选择Mesos替换YARN,一旦MapReduce接口改变,所有的资源管理系统的实现均需要跟着改变;但以YARN为核心的软件栈则不同,所有框架都需要实现YARN定义的对外接口以运行在YARN之上,这意味着Hadoop2.X可以打造一个以YARN为核心的生态系统。
随着互联网的高速发展,基于数据密集型应用的计算框架不断出现,从支持离线处理的MapReduce,到支持在线处理的Storm,从迭代式计算框架Spark到流式处理框架S4,各种框架诞生于不同的公司或者实验室,它们各有所长,各自解决了某一类应用问题。而在大部分互联网公司中,这几种框架可能同时被采用,比如在搜索引擎公司中,一种可能的技术方案如下:网页建立索引采用MapReduce框架,自然语言处理/数据挖掘采用Spark(如网页PageRank计算、聚类分类算法等),对性能要求很高的数据挖掘算法用MPI等。考虑到资源利用率、运维成本、数据共享等因素,公司一般希望将所有这些框架都部署到一个公共的集群中,让它们共享集群的资源,并对资源进行统一使用,同时采用某种资源隔离方案(如轻量级cgroups)对各个任务进行隔离,这样便诞生了轻量级计算平台,如下图所示,YARN便是弹性计算平台的典型代表。
YARN是一个弹性计算平台,它的目标已经不再局限于支持MapReduce一种计算框架,而是朝着对多种框架进行统一管理的方向发展。相比于“一种计算框架一个集群”的模式,共享集群的模式存在多种好处:
资源利用率高。如果每个框架一个集群,则往往由于应用程序数量和资源需求的不均衡性,使得在某段时间内,有些计算框架的集群资源紧张,而另外一些集群资源空闲。共享集群模式则通过多种框架共享资源,使得集群中的资源得到更加充分的利用。
运维成本低。如果采用“一个框架一个集群”的模式,则可能需要多个管理员管理这些集群,进而增加运维成本,而共享集群模式通常仅需要少数管理员即可完成多个框架的统一管理。
数据共享。随着数据量的暴增,跨集群间的数据移动不仅需要花费更长的时间,且硬件成本也会大大增加,而共享集群模式可让多种框架共享数据和硬件资源,将大大减小数据移动带来的成本。
2、YARN基本架构
YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManager启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。
下图描述了YARN的基本组成结构,YARN主要由ResourceManager、NodeManager、ApplicationMaster(图中给出了MapReduce和MPI两种计算框架的ApplicationMaster,分别为MRAppMstr和MPI AppMstr)和Container等几个组件构成。