目录
(一)概述
YARN作为一个通用的资源管理系统,目标是将短期作业和长期服务混合部署到一个集群中,并为它们提供统一的资源管理和调度功能。YARN是大数据系统发展到一定阶段的必然产物,其他类似的框架还有Google Borg、Google Omega、Twitter Mesos等。概括起来,资源管理系统需要解决如下两个问题:
1.提高集群资源利用率
在大数据时代,为了存储和处理海量数据,需要规模较大的集群服务或者数据中心,运行数量众多、类型繁杂的应用程序,例如离线作业、流式作业、迭代式作业等。这些服务的资源利用率通常很不均衡,有一些满负荷运行,有一些则长期闲置。为了让各种类型的服务集合成一个大集群,共享所有的资源,并由一个系统统一调度和分配,这就诞生了类似于YARN的系统。
2.服务自动化部署
一旦将所有计算资源抽象成一个“大型计算机”后,就会产生一个问题:公司的各种服务如何部署?因此,这类四通实际上也是一种服务统一管理系统,提供服务资源申请、服务自动化部署、服务容错等功能。
(二)YARN基本架构
YARN总体上采用了Master/Slave架构,其中,ResourceManager为Master,NodeManager为Slave,ResourceManager服务对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以追踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManager启动可以占用一定资源的任务,由不同的ApplicationMaster被分不到不同的节点上,因此它们之间不会相互影响。详情如下图所示:
下面讲述各个组件的详情:
1.ResourceManager(RM):RM是一个全局的资源管理器,负责整个系统的资源管理和分配,主要由两个组件构成:调度器(Scheduler)和应用管理器(Application Manager)。
调度器(Scheduler):调度器功能主要功能是根据资源容量、队列等方面的限制条件,将系统中的资源分配给各个应用程序。YARN中的调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,例如监控或者跟踪应用的执行状态,这些会交给ApplicationMaster来负责。
应用管理器(Application Manager):负责整个系统中的所有应用程序,包括应用程序的提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运营状态并在失败时重启它等。
2.ApplicationMaster(AM):用户提交的每个应用程序均包含一个独立的AM,主要功能包括:与RM调度器协商以获得资源;将得到的资源进一步分配给其内部的任务;与NM通信以启动/停止任务;监控所有任务的运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
3.NodeManager(NM):NM是每个节点上的资源管理器,一方面会定时向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自AM的任务启动/停滞等各种请求。由于YARN内置了容错机制,单个NM的故障不会对集群中的应用程序运行产生严重影响。
4.Container:Container是YARN中的基本资源分配单位,是对应用程序运行环境的抽象,并为应用程序提供资源隔离环境。它封装了多维度的资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是使用Container表示的。YARN中每个人物均会对应一个Container,且该任务只能使用该Container中描述的资源。
(三)YARN高可用性
YARN提供了恢复机制,这使得YARN在服务出现故障或者人工重启时,不会对正在运行的应用程序产生任何影响。包括如下三个方面:
1.ResourceManager HA:ResourceManager负责集群中资源的调度和应用程序的管理,是YARN最核心的组件。由于YARN采用了Master/Slave架构,这使得ResourceManager有了单点故障的可能性。为了避免ResourceManager的故障导致整个集群不可用,YARN映入了Active/Standby ResourceManager,通过Zookeeper的选举机制,通过冗余方式解决ResourceManager单点故障。
2.ResourceManager Recovery:ResourceManager内置了重启恢复功能,当ResourceManager就低重启,发生Active/Standby切换时,不会影响正在运行的应用程序运行。具体包括如下流程:第一步,保存元信息:包括应用程序的元信息、状态信息及安全凭证等信息持久化到状态存储系统中,存储系统可以是Zookeeper、FileSystem或者是LevelDB;第二步,加载元信息,一旦Active ResourceManager出现了故障,新启动的ResourceManager将从相关存储系统中重新加载相关信息;第三步,重构状态信息:新的ResourceManager重启完成后,各个NodeManageer会向它重新注册,将所管理的Container信息汇报给ResourceManager。同时,ApplicationMaster会向ResourceManager重新发送资源请求,以便ResourceManager重新为其分配资源。
3.NodeManageer Recovery:NodeManager同样内置了重启恢复功能,当NodeManager重启时,之前正在运行的Container不会被杀掉,而是由新的NodeManager接管,并正常运行。
(四)YARN工作流程
运行在YARN上的应用程序主要分为两类:短作业和长服务。其中,短作业是指一定时间内(分钟级或小时级)可运行完成的任务,如MapReduce作业、Spark作业等;长服务指不出意外,永不终止运行的应用程序,通常是一些在线服务,如Storm Service、HBase Service等,它们本身作为一个框架提供访问接口供用户使用。
当用户向YARN提交了一个应用程序后,YARN将分两个阶段运行该应用程序:第一个阶段时启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它们申请资源,并监控整个运行过程,直到运行成功。如下图所示:
具体工作流程如下:
1.提交应用程序:用户通过客户端与YARN ResourceManager通信,以提交应用程序,应用程序中需包含ApplicationMaster可执行代码、启动命令、资源需求、应用程序代码、资源需求的优先级等信息;
2.启动ApplicationMaster:ResourceManager为该应用程序分配第一个Container,并与之对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster,之后ApplicationMaster的生命周期被ResourceManager管理;
3. ApplicationMaster注册:ApplicationMaster启动后,首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后,它将初始应用化程序,并按照一定的策略为内部任务申请资源,监控运行状态,直到运行结束,即重复步骤4~7;
4.资源获取:ApplicationMaster采用轮询的方式,通过RPC协议向ResourceManager申请和领取资源;
5.请求启动Container:一旦ApplicationMaster申请到资源后,则与对应的NodeManager通信,请求为其启动任务;
6.启动Container:NodeManager为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过ContaExecutor运行该脚本启动任务;
7.Container监控:ApplicationMaster可通过两种方式获取各个Container的运行状态,以便在任务失败时重新启动任务,包括周期性心跳信息和RPC协议汇报;
8.注销ApplicationMaster:应用程序完成后,ApplicationMaster向ResourceManager注销,并退出执行。
(五)YARN资源调度器
1.Capacity Scheduler
Capacity Scheduler是雅虎开发的多租户调度器,以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可以设定一定的资源使用以防止资源滥用。当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。Capacity Scheduler的特点主要有:
(1)容量保证:管理员可以为每个队列设置资源最低保证和资源使用上限,而所有提交到该队列的应用程序共享这些资源;
(2)灵活性:如果一个队列的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列释放资源后会归还给该队列;
(3)多重租赁:支持多用户共享集群和多应用程序同时运行,以防止单个应用程序、用户或者队列独占集群中的资源,管理员可为之增加多重约束;
(4)安全保证:管理员可通过ACL限制每个队列的访问控制列表,普通用户可为自己的应用程序指定其他哪些用户可管理它;
(5)动态更新配置文件:管理员可根据需要动态修改各种资源调度器相关配置参数而无需重启集群。
2.Fair Scheduler
Fair Scheduler是Facebook开发的多用户调度器,同样以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限。与Capacity Scheduler的不同点主要体现在如下方面:
(1)资源公平共享:每个队列中,Fair Scheduler可选择按照FIFO、Fair或DRF策略为应用程序分配资源,其中Fair策略是一种基于最大最小公平法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果是三个应用程序,则分配到1/3的资源。
(2)调度策略配置灵活:Fair Scheduler允许管理员为每个队列单独设置调度策略;
(3)提高小应用程序响应时间:由于采用了最大最小公平算法,小作业可以快速获取资源并运行完成;
(4)应用程序在队列间转移:用户可动态将一个正在运行的应用从一个队列转移到另外一个队列。
以上两种调度方式的对比如下:
3.基于节点标签的调度
基于节点标签的调度是一种调度策略,就像基于优先级的调度一样,是调度器中众多调度策略中的一种,可以跟其他调度策略混合使用。该策略的基本思想是:用户可为每个NodeManager打上标签,比如high、low等,以作为NodeManager的基本属性;同时,用户可以为调度器中的队列设置若干标签,以限制该队列只能占用包含对应标签的节点资源,这样,提交到某个队列中的作业,只能运行在特定的一些节点上。通过打标签,用户可以将Hadoop分成若干个子集群,进而使得用户可将应用程序运行到符合某种特征的节点上,比如可将内存密集型的应用程序运行到大内存节点上。
(六)YARN的具体调度场景
例子:公司最初的Hadoop集群有20个节点,硬件资源是32G内存,4TB硬盘。随着Spark框架的流行,公司希望引入Spark技术,因此购买了10个64GB的大内存节点。为了让Spark和MapReduce等不同类型的程序运行在一个集群中,公司规定,Spark程序智能运行在后来的10个大内存节点上,之前的20个节点运行MapReduce任务。
如何在YARN中实现这种调度方式呢?
1.首先,为20个旧节点打上normal标签,为10个新节点打上highmem标签;
2.其次,在Capacity Scheduler中,创建两个队列,分别是四Hadoop和Spark,其中Hadoop队列可使用标签是normal和highmem,而Spark是highmem,并配置两个队列的相关属性;
3.最后,将Spark任务提交到Spark队列中,而MapReduce任务提交到Hadoop队列中。
值得注意的是,为了提高资源利用率,资源调度器会将负载较轻的队列资源暂时分配给负载较重的队列,仅当负载较轻的队列突然收到新提交的应用程序时,调度器才会进一步将本该属于该队列的资源分配给它,但由于此时资源可能正在被其他队列使用,释放时间不确定,因此调度器等待一定时间后发现资源未释放,则进行资源抢占。
(七)YARN资源隔离
资源隔离指为不同任务提供可独立使用的计算资源,以避免它们相互干扰。YARN对内存资源和CPU资源采用了不同的隔离方案。对于内存资源,它是一种限制性资源,它的量大小直接决定了应用程序的死活,为了能够更灵活的控制内存使用,YARN提供了两种可选方案:线程监控方案和基于轻量级资源隔离技术Cgroups的方案。默认情况下,YARN采用了进程监控的方案控制内存使用,即每个NodeManager会启动一个额外的线程监控每个Container的内存资源使用量,一旦发现它超过约定的资源量,则会将其杀死。采用这种机制的一个原因是因为Java中创建子进程采用了“fork()+exec()”的方案,子进程启动瞬间,它使用的内存量与父进程一直,从外面看来,一个进程的使用内存量可能瞬间翻倍,然后又降下来,采用线程监控的方法可以防止这种情况下导致swap操作。另一种可选方案基于轻量级资源隔离技术Cgroups,Cgroups是Linux内核提供的弹性资源隔离机制,可以严格控制内存使用上限,一旦进程使用资源量超过了实现定义的上限值,则可将其杀死。对于CPU资源,它是一种弹性资源,它的大小不直接影响应用程序的死活,因此采用了Cgroups方案。
(八)YARN生态系统
YARN发展到今天,已经成为了一个数据操作系统,很多新的计算框架离开了YARN将不再能够单独运行,典型的代表是DAG计算框架Tez和Spark。总结起来,支持运行在YARN上的计算框架和服务主要有:
1.MapReduce:经典的离线计算框架;
2.Tez:Hortonworks开源的DAG计算框架,在MapReduce基础上扩展而来,重用了MapReduce大量代码,广泛的应用在Hive、Pig等引擎中;
3.Storm:流式实时计算框架,运行环境由Nimnus和Supervisor等组件组成;
4.Spark:通用的DAG内存计算引擎,适合于数据挖掘、机器学习等方面的应用,相较于MapReduce,更加的高效易用;
5.HBase:构建在HDFS之上的数据库系统;
6.Giraph:开源图算法库;
7.OpenMPI:经典的高性能并行编成接口。
(九)资源管理系统架构演化