1、简介
Yarn是Hadoop的分布式资源调度平台,负责为集群的运算提供运算资源。如果把分布式计算和单个计算机对应的话,HDFS就相当于计算机的文件系统,Yarn就是计算机的操作系统,MapReduce就是计算机上的应用程序。
2、组成部分
Yarn主要由ResourceManager(RM)、NodeManager、ApplicationMaster(AM)和Container等组件组成。
ResourceManager:整个集群的中心,负责集群的资源分配和调度。它与每个节点上的NodeManager和每一个应用程序上的ApplicationMaster协调工作,由两个组件构成:资源调度器(Scheduler)和应用程序管理器(Application Manager)。
ResourceManager主要作用
1)处理客户端请求
2)监控NodeManager
3)启动或监控ApplicationMaster(AM会周期性向RM发送心跳确认健康状态和所需资源)
4)资源分配和调度
Scheduler主要作用
顾名思义,它仅仅负责各个运行中的应用的资源(container)分配,不会关心或监控应用程序的具体状态,也不能去重启各种运行失败的应用。对于多个客户端的应用资源请求,Scheduler会将这些作业放在一个或者多个作业队列中,并按照设置的调度方法分配container。
ApplicaitonManager主要作用
主要接受job的提交请求,为应用分配第一个container来运行applicationMaster,还有就是负责监控ApplicaitonMaster,在遇到失败时重启ApplicationMaster运行的Container。
NodeManager:单个节点的中心,管理本节点的用户作业和工作流。
NodeManger主要作用
1)管理单个节点上的资源
2)处理来自ResourceManager的命令
3)处理来自ApplicationManager的命令
ApplicationMaster:单个应用程序的中心,向ResourceManager申请资源并和NodeManager协同工作来运行应用的各个任务,然后跟踪它们的状态及监控各个任务的执行,遇到失败的任务还负责重启它。
Container:Yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
3、工作流程
工作流程(以下步骤与图中标号对应)
1、客户端程序向Resource Manager提交应用并请求一个ApplicationMaster实例(图1中,两个不同颜色的任务,每一个对应一个ApplicationMaster)。2、Resource Manager找到可以运行一个Container的NodeManager,并在这个Container中启动ApplicationMaster实例。
3、确定好ApplicationMaster后,会向Resource Manager注册,注册后客户端就可以查询ResourceManager获取自己ApplicationMaster的详细信息,以后就可以和自己的的ApplicationMaster进行交互了。
4、在平常的操作过程中,ApplicationMaster根据resource-request协议向ResourceManager发送请求。
5、当Container被成功分配后,ApplicationMaster通过向NodeManager发送container-launch-specification信息来启动container,container-launch-specification信息包含了能够让Container和ApplicationMaster交流所需要的信息。
6、应用程序的代码在启动的Container中运行,并把运行的进度、状态等信息通过application-specific协议发送给对应的ApplicationMaster。
7、在应用程序运行期间,提交的客户端主动和ApplicationMaster交流获取应用的运行状态、进度更新等信息,交流的协议也是application-specific。
8、一旦应用程序运行完成并且所有的相关工作也已经完成,ApplicationMaster向ResouceManager取消注册然后关闭,用到所有的Container也归还给系统。
Yarn的设计目标就是允许我们的各种应用以共享、安全、多租户的形式使用整个集群。并且,为了保证集群资源调度和数据访问的高效性,Yarn还必须能够感知整个集群拓扑结构。为了实现这些目标,ResourceManager的调度器Scheduler为应用程序的资源请求定义了一些灵活的协议,通过它就可以对运行在集群中的各个应用做更好的调度,因此,这就诞生了Resource Request和Container。
具体来讲,一个应用先向ApplicationMaster发送一个满足自己需求的资源请求,然后ApplicationMaster把这个资源请求以resource-request的形式发送给ResourceManager的Scheduler,Scheduler再在这个原始的resource-request中返回分配到的资源描述Container。每个ResourceRequest可看做一个可序列化Java对象,包含的字段信息如下:
<resource-name, priority, resource-requirement, number-of-containers>
number-of-containers中的Containers就是ResourceManager给ApplicationMaster分配资源的结果。Container就是授权给应用程序可以使用某个节点机器上CPU和内存的数量。
ApplicationMaster在得到这些Containers后,还需要与分配Container所在机器上的NodeManager交互来启动Container并运行相关任务。当然Container的分配是需要认证的,以防止ApplicationMaster自己去请求集群资源。