1. 介绍
YARN(Yet Another Resource Negotiator)是一个通用的资源管理平台,可为各类计算框架提供资源的管理和调度。
之前有提到过,Yarn主要是为了减轻Hadoop1中JobTracker的负担,对其进行了解耦。现在通常都会使用Hadoop Yarn,因为其稳定性更加优秀,YARN是对Mapreduce V1重构得到的,有时候也称为MapReduce V2。
2. YARN体系架构
首先,整个Hadoop Yarn和Hadoop1一样,也是建立在hdfs分布式文件系统上,hdfs是为了集群而生的,它依托于整个Hadoop集群所有的硬盘容量。例如整个集群有100台服务器,每个服务器有都有5T的容量,那么整个hdfs最大可以有500T容量(这里只是打个比喻,因为服务器本身操作系统需要占用空间,并且还需要安装一些必要的组件,Hadoop本身程序也需要占用空间,因此肯定会小于500T)。用户在使用hdfs文件系统的时候,需要先将本地的文件put到文件系统上,然后集群才能使用这些数据,具体如何使用后续会有详细的图文讲解。
YARN架构如下图所示:
YARN总体上是Master/Slave结构,主要由ResourceManager、NodeManager、 ApplicationMaster和Container等几个组件构成。
-
ResourceManager(RM)
负责对各NM上的资源进行统一管理和调度。将AM分配空闲的Container运行并监控其运行状态。对AM申请的资源请求分配相应的空闲Container。主要由两个组件构成:调度器和应用程序管理器:-
调度器(Scheduler):调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container,从而限定每个任务使用的资源量。Shceduler不负责监控或者跟踪应用程序的状态,也不负责任务因为各种原因而需要的重启(由ApplicationMaster负责)。总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为应用程序分配封装在Container中的资源。
调度器是可插拔的,例如CapacityScheduler、FairScheduler。具体看下文的调度算法。 -
应用程序管理器(Applications Manager):应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动AM、监控AM运行状态并在失败时重新启动等,跟踪分给的Container的进度、状态也是其职责。
-
-
NodeManager (NM)
NM是每个节点上的资源和任务管理器。它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;同时会接收并处理来自AM的Container 启动/停止等请求。 -
ApplicationMaster (AM):
用户提交的应用程序均包含一个AM,负责应用的监控,跟踪应用执行状态,重启失败任务等。ApplicationMaster是应用框架,它负责向ResourceManager协调资源,并且与NodeManager协同工作完成Task的执行和监控。MapReduce就是原生支持的一种框架,可以在YARN上运行Mapreduce作业。有很多分布式应用都开发了对应的应用程序框架,用于在YARN上运行任务,例如Spark,Storm等。如果需要,我们也可以自己写一个符合规范的YARN application。 -
Container:
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container 表示的。 YARN会为每个任务分配一个Container且该任务只能使用该Container中描述的资源。
3. YARN应用工作流程
如下图所示用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:
-
启动AM ,如下步骤1~3;
-
由AM创建应用程序为它申请资源并监控它的整个运行过程,直到运行完成,如下步骤4~7。
YARN应用工作流程图
1、用户向YARN中提交应用程序,其中包括AM程序、启动AM的命令、命令参数、用户程序等;事实上,需要准确描述运行ApplicationMaster的unix进程的所有信息。提交工作通常由YarnClient来完成。
2、RM为该应用程序分配第一个Container,并与对应的NM通信,要求它在这个Container中启动AM;
3、AM首先向RM注册,这样用户可以直接通过RM査看应用程序的运行状态,运行状态通过 AMRMClientAsync.CallbackHandler的getProgress() 方法来传递给RM。 然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4〜7;
4、AM采用轮询的方式通过RPC协议向RM申请和领取资源;资源的协调通过 AMRMClientAsync异步完成,相应的处理方法封装在AMRMClientAsync.CallbackHandler中。
5、—旦AM申请到资源后,便与对应的NM通信,要求它启动任务;通常需要指定一个ContainerLaunchContext,提供Container启动时需要的信息。
6、NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;
7、各个任务通过某个RPC协议向AM汇报自己的状态和进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;ApplicationMaster与NM的通信通过NMClientAsync object来完成,容器的所有事件通过NMClientAsync.CallbackHandler来处理。例如启动、状态更新、停止等。
8、应用程序运行完成后,AM向RM注销并关闭自己。
之后会继续学习另一个重要的zookeeper,这是Hadoop Ha模式最重要的一环。
笔者也是在分享中不断的学习,如果大家有什么建议或者疑问,欢迎一起交流