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正在运行作业查看
图五,已完成作业查看
图六,作业中的各个状态查看