YARN的描述

一·描述YARN的架构

概述

YARN是一个资源管理、任务调度的框架,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。其中,ResourceManager是Master上一个独立运行的进程,负责集群统一的资源管理、调度、分配等等;NodeManager是Slave上一个独立运行的进程,负责上报节点的状态;App Master和Container是运行在Slave上的组件,Container是yarn中分配资源的一个单位,包涵内存、CPU等等资源,yarn以Container为单位分配资源。。而每个AM则会和RM协商资源,同时和NodeManager通信来执行和监控task。

     

Client客户端把所需的请求提交给RM,RM根据机群的使用情况去找NM,然后启动AM,AM启动后告诉RM并根据需求让RM分配资源.得到分配权力后AM通知NM使其分配出Container(为作业提供的一个场所)来进行资源的管理。

二·描述YARN的运行流程

当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:第一个阶段是启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。

    

1.      Client客户端向RM提交作业(RM类似一个主节点,NM类似分节点)

2.      RM去找分节点NM,NM上有资源,将在分节点上进行工作

3.      NM得到RM的命令,启动AM。

4.      AM启动后通知RM,并且AM与RM建立相互心跳,来进行对作业所需资源的协调,此时此刻作业交给了AM

5.      当第一个节点不够用时,根据第四步AM向RM所要新的节点(或者AM得到作业后,向RM所要资源节点,然后就得到其他NM),RM就会在机群中寻找其他可用空余节点并告诉AM,AM就会到这个相应节点上分配作业。

6.      相应的NM得到AM的命令后,启动TASK。(TASK作业是在Container中启动的)

 

YARN 的作业运行,主要由以下几个步骤组成

1. 作业提交

 client 调用job.waitForCompletion方法,向整个集群提交MapReduce作业 (第1步) 。 新的作业ID(应用ID)由资源管理器分配(第2步). 作业的client核实作业的输出, 计算输入的split, 将作业的资源(包括Jar包, 配置文件, split信息)拷贝给HDFS(第3步). 最后, 通过调用资源管理器的submitApplication()来提交作业(第4步).

2. 作业初始化

当资源管理器收到submitApplciation()的请求时, 就将该请求发给调度器(scheduler),调度器分配container,然后资源管理器在该container内启动应用管理器进程, 由节点管理器监控(第5步).

 MapReduce作业的应用管理器是一个主类为MRAppMaster的Java应用. 其通过创造一些bookkeeping对象来监控作业的进度, 得到任务的进度和完成报告(第6步). 然后其通过分布式文件系统得到由客户端计算好的输入split(第7步). 然后为每个输入split创建一个map任务, 根据mapreduce.job.reduces创建reduce任务对象.

 3. 任务分配

 如果作业很小, 应用管理器会选择在其自己的JVM中运行任务。

如果不是小作业, 那么应用管理器向资源管理器请求container来运行所有的map和reduce任务(第8步). 这些请求是通过心跳来传输的, 包括每个map任务的数据位置, 比如存放输入split的主机名和机架(rack). 调度器利用这些信息来调度任务, 尽量将任务分配给存储数据的节点, 或者分配给和存放输入split的节点相同机架的节点.

 4. 任务运行

 当一个任务由资源管理器的调度器分配给一个container后, 应用管理器通过联系节点管理器来启动container(第9步). 任务由一个主类为YarnChild的Java应用执行. 在运行任务之前首先本地化任务需要的资源, 比如作业配置, JAR文件, 以及分布式缓存的所有文件(第10步). 最后, 运行map或reduce任务(第11步).

YarnChild运行在一个专用的JVM中, 但是YARN不支持JVM重用.

 5. 进度和状态更新

YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。

 6. 作业完成

  除了向应用管理器请求作业进度外, 客户端每5分钟都会通过调用waitForCompletion()来检查作业是否完成. 时间间隔可以通过mapreduce.client.completion.pollinterval来设置. 作业完成之后, 应用管理器和container会清理工作状态, OutputCommiter的作业清理方法也会被调用. 作业的信息会被作业历史服务器存储以备之后用户核查.

三·在UI(用户界面)上做常用的操作

                                     图一,HA的启动

                                      图二,RM的查看

                                         图三,RM页面

                           图四,YARN正在运行作业查看

                                   图五,已完成作业查看

                           图六,作业中的各个状态查看