一、简介
为了实现一个Hadoop集群的集群共享、可伸缩性和可靠性,并消除早期MapReduce框架中的JobTracker性能瓶颈,开源社区引入了统一的资源管理框架YARN。
YARN是将JobTracker的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。
二、YARN结构
YARN分层结构的本质是ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。ResourceManager将各个资源部分(计算、内存、带宽等)精心安排给基础NodeManager(YARN的每节点代理)。ResourceManager还与Application Master一起分配资源,与NodeManager一起启动和监视它们的基础应用程序。在此上下文中,Application Master承担了以前的TaskTracker的一些角色,ResourceManager 承担了JobTracker的角色。
Application Master管理一个在YARN内运行的应用程序的每个实例。Application Master负责协调来自ResourceManager的资源,并通过NodeManager监视容器的执行和资源使用(CPU、内存等的资源分配)。
NodeManager管理一个YARN集群中的每个节点。NodeManager提供针对集群中每个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。MRv1通过插槽管理Map和Reduce任务的执行,而NodeManager管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。
YARN结构,如下图所示:
名称 | 描述 |
---|---|
Client | YARN Application客户端,用户可以通过客户端向ResourceManager提交任务,查询Application运行状态等。 |
ResourceManager(RM) | 负责集群中所有资源的统一管理和分配。接收来自各个节点(NodeManager)的资源汇报信息,并根据收集的资源按照一定的策略分配给各个应用程序。 |
NodeManager(NM) | NodeManager(NM)是YARN中每个节点上的代理,管理Hadoop集群中单个计算节点,包括与ResourceManger保持通信,监督Container的生命周期管理,监控每个Container的资源使用(内存、CPU等)情况,追踪节点健康状况,管理日志和不同应用程序用到的附属服务(auxiliary service)。 |
ApplicationMaster(AM) | 即图中的App Mstr,负责一个Application生命周期内的所有工作。包括:与RM调度器协商以获取资源;将得到的资源进一步分配给内部任务(资源的二次分配);与NM通信以启动/停止任务;监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。 |
Container | Container是YARN中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等(目前仅封装内存和CPU),当AM向RM申请资源时,RM为AM返回的资源便是用Container表示。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。 |
在YARN中,资源调度器是以层级队列方式组织资源的,这种组织方式有利于资源在不同队列间分配和共享,进而提高集群资源利用率。如下图所示,Superior Scheduler和Capacity Scheduler的核心资源分配模型相同。
调度器会维护队列的信息。用户可以向一个或者多个队列提交应用。每次NM心跳的时候,调度器会根据一定规则选择一个队列,再选择队列上的一个应用,并尝试在这个应用上分配资源。若因参数限制导致分配失败,将选择下一个应用。选择一个应用后,调度器会处理此应用的资源申请。其优先级从高到低依次为:本地资源的申请、同机架的申请,任意机器的申请。
三、YARN原理
新的Hadoop MapReduce框架被命名为MRv2或YARN。YARN主要包括ResourceManager、ApplicationMaster与NodeManager三个部分。
-
ResourceManager:RM是一个全局的资源管理器,负责整个系统的资源管理和分配。主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications
Manager)。 -
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念Container表示。Container是一个动态资源分配单位,将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如FairScheduler和Capacity Scheduler等。
-
应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动等。
-
NodeManager:NM是每个节点上的资源和任务管理器,一方面,会定时向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,接收并处理来自AM的Container启动/停止等请求。
-
ApplicationMaster:AM负责一个Application生命周期内的所有工作。包括:
与RM调度器协商以获取资源。
将得到的资源进一步分配给内部的任务(资源的二次分配)。
与NM通信以启动/停止任务。
监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
四、开源容量调度器Capacity Scheduler原理
Capacity Scheduler是一种多用户调度器,它以队列为单位划分资源,为每个队列设定了资源最低保证和使用上限。同时,也为每个用户设定了资源使用上限以防止资源滥用。而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。
Capacity Scheduler支持多个队列,为每个队列配置一定的资源量,并采用FIFO调度策略。为防止同一用户的应用独占队列资源,Capacity Scheduler会对同一用户提交的作业所占资源量进行限定。调度时,首先计算每个队列使用的资源,选择使用资源最少的队列;然后按照作业优先级和提交时间顺序选择,同时考虑用户资源量的限制和内存限制。Capacity Scheduler主要有如下特性:
- 容量保证。集群管理员可为每个队列设置资源最低保证和资源使用上限,而所有提交到队列的应用程序共享这些资源。
- 灵活性。如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则占用资源的队列将资源释放给该队列。这种资源灵活分配的方式可明显提高资源利用率。
- 多重租赁。支持多用户共享集群和多应用程序同时运行。为防止单个应用程序、用户或者队列独占集群中的资源,集群管理员可为之增加多重约束(比如单个应用程序同时运行的任务数等)。
- 安全保证。每个队列有严格的ACL列表规定它的访问用户,每个用户可指定哪些用户允许查看自己应用程序的运行状态或者控制应用程序。此外,集群管理员可指定队列管理员和集群系统管理员。
- 动态更新配置文件。集群管理员可根据需要动态修改配置参数以实现在线集群管理
Capacity Scheduler中每个队列可以限制资源使用量。队列间的资源分配以使用量作为排列依据,使得容量小的队列有竞争优势。集群整体吞吐较大,延迟调度机制使得应用可以有机会放弃跨机器或者跨机架的调度,争取本地调度。
五、YARN HA原理与实现方案
YARN中的ResourceManager负责整个集群的资源管理和任务调度,在Hadoop2.4版本之前,ResourceManager在YARN集群中存在单点故障的问题。YARN高可用性方案通过引入冗余的ResourceManager节点的方式,解决了这个基础服务的可靠性和容错性问题。
ResourceManager的高可用性方案是通过设置一组Active/Standby的ResourceManager节点来实现的(如图1)。与HDFS的高可用性方案类似,任何时间点上都只能有一个ResourceManager处于Active状态。当Active状态的ResourceManager发生故障时,可通过自动或手动的方式触发故障转移,进行Active/Standby状态切换。
在未开启自动故障转移时,YARN集群启动后,集群管理员需要在命令行中使用yarn rmadmin命令手动将其中一个ResourceManager切换为Active状态。当需要执行计划性维护或故障发生时,则需要先手动将Active状态的ResourceManager切换为Standby状态,再将另一个ResourceManager切换为Active状态。
开启自动故障转移后,ResourceManager会通过内置的基于ZooKeeper实现的ActiveStandbyElector来决定哪一个ResourceManager应该成为Active节点。当Active状态的ResourceManager发生故障时,另一个ResourceManager将自动被选举为Active状态以接替故障节点。
当集群的ResourceManager以HA方式部署时,客户端使用的“yarn-site.xml”需要配置所有ResourceManager地址。客户端(包括ApplicationMaster和NodeManager)会以轮询的方式寻找Active状态的ResourceManager,也就是说客户端需要自己提供容错机制。如果当前Active状态的ResourceManager无法连接,那么会继续使用轮询的方式找到新的ResourceManager。
备RM升主后,能够恢复故障发生时上层应用运行的状态(详见ResourceManger Restart)。当启用ResourceManager Restart时,重启后的ResourceManager就可以通过加载之前Active的ResourceManager的状态信息,并通过接收所有NodeManager上container的状态信息重构运行状态继续执行。这样应用程序通过定期执行检查点操作保存当前状态信息,就可以避免工作内容的丢失。状态信息需要让Active/Standby的ResourceManager都能访问。当前系统提供了三种共享状态信息的方法:通过文件系统共享FileSystemRMStateStore)、通过LevelDB数据库共享(LeveldbRMStateStore)或通过ZooKeeper共享(ZKRMStateStore)。这三种方式中只有ZooKeeper共享支持Fencing机制。Hadoop默认使用ZooKeeper共享。
关于YARN高可用性方案的更多信息,可参考如下链接:
http://hadoop.apache.org/docs/r3.1.1/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
https://hadoop.apache.org/docs/r3.3.1/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
六、Yarn和Spark组件的关系
Spark的计算调度方式,可以通过Yarn的模式实现。Spark共享Yarn集群提供丰富的计算资源,将任务分布式的运行起来。Spark on Yarn分两种模式:Yarn Cluster和Yarn Client。
- Yarn Cluster模式Spark on yarn-cluster运行框架
- Spark on yarn-cluster实现流程:
- 首先由客户端生成Application信息,提交给ResourceManager。
- ResourceManager为Spark Application分配第一个Container(ApplicationMaster),并在该Container上启动Driver。
- ApplicationMaster向ResourceManager申请资源以运行Container。
ResourceManager分配Container给ApplicationMaster,ApplicationMaster和相关的NodeManager通讯,在获得的Container上启动Executor,Executor启动后,开始向Driver注册并申请Task。 - Driver分配Task给Executor执行。
- Executor执行Task并向Driver汇报运行状况。
- Yarn Client模式Spark on yarn-client运行框架
Spark on yarn-client实现流程:
在yarn-client模式下,Driver部署在Client端,在Client端启动。yarn-client模式下,不兼容老版本的客户端。推荐使用yarn-cluster模式。
- 客户端向ResourceManager发送Spark应用提交请求,ResourceManager为其返回应答,该应答中包含多种信息(如ApplicationId、可用资源使用上限和下限等)。Client端将启动ApplicationMaster所需的所有信息打包,提交给ResourceManager上。
- ResourceManager收到请求后,会为ApplicationMaster寻找合适的节点,并在该节点上启动它。ApplicationMaster是Yarn中的角色,在Spark中进程名字是ExecutorLauncher。
- 根据每个任务的资源需求,ApplicationMaster可向ResourceManager申请一系列用于运行任务的Container。
- 当ApplicationMaster(从ResourceManager端)收到新分配的Container列表后,会向对应的NodeManager发送信息以启动Container。
ResourceManager分配Container给ApplicationMaster,ApplicationMaster和相关的NodeManager通讯,在获得的Container上启动Executor,Executor启动后,开始向Driver注册并申请Task。
正在运行的container不会被挂起释放资源。
- Driver分配Task给Executor执行。Executor执行Task并向Driver汇报运行状况。
七、Yarn和MapReduce的关系
MapReduce是运行在Yarn之上的一个批处理的计算框架。MRv1是Hadoop 1.0中的MapReduce实现,它由编程模型(新旧编程接口)、运行时环境(由JobTracker和TaskTracker组成)和数据处理引擎(MapTask和ReduceTask)三部分组成。该框架在扩展性、容错性(JobTracker单点)和多框架支持(仅支持MapReduce一种计算框架)等方面存在不足。MRv2是Hadoop 2.0中的MapReduce实现,它在源码级重用了MRv1的编程模型和数据处理引擎实现,但运行时环境由Yarn的ResourceManager和ApplicationMaster组成。其中ResourceManager是一个全新的资源管理系统,而ApplicationMaster则负责MapReduce作业的数据切分、任务划分、资源申请和任务调度与容错等工作。
八、Yarn和ZooKeeper的关系
ZooKeeper与Yarn的关系
- 在系统启动时,ResourceManager会尝试把选举信息写入ZooKeeper,第一个成功写入ZooKeeper的ResourceManager被选举为Active ResourceManager,另一个为Standby ResourceManager。Standby ResourceManager定时去ZooKeeper监控Active ResourceManager选举信息。
- Active ResourceManager还会在ZooKeeper中创建Statestore目录,存储Application相关信息。当Active ResourceManager产生故障时,Standby ResourceManager会从Statestore目录获取Application相关信息,恢复数据。
九、Yarn和SmallFS的关系
SmallFS将会定期运行merge、delete、cleanup任务,而这些任务是在Yarn上运行MapReduce任务来对HDFS上的文件数据进行merge、delete和cleanup操作。
十、Yarn和Tez的关系
Hive on Tez作业信息需要Yarn提供TimeLine Server能力,以支持Hive任务展示应用程序的当前和历史状态,便于存储和检索。