Apache Hadoop YARN

YARN的概述

Apache Yarn(Yet Another Resource Negotiator的缩写)是hadoop集群资源管理器系统,Yarn从hadoop 2引入,最初是为了改善MapReduce的实现,但是它具有通用性,同样执行其他分布式计算模式。

在MapReduce1中,具有如下局限性:

1、扩展性差:jobtracker兼顾资源管理和作业控制跟踪功能跟踪任务,启动失败或迟缓的任务,记录任务的执行状态,维护计数器),压力大,成为系统的瓶颈
2、可靠性差:采用了master/slave结构,master容易单点故障
3、资源利用率低:基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完一个槽位的资源,hadoop1分为map slot和reduce slot,而它们之间资源不共享,造成一些资源空闲。
4、不支持多框架:不支持多种计算框架并行

yarn很好解决了MapReduce1中的局限性:yarn基本思想;一个全局的资源管理器resourcemanager和与每个应用对用的ApplicationMaster,Resourcemanager和NodeManager组成全新的通用系统,以分布式的方式管理应用程序。

所以针对MapReduce1,yarn就有了如下特点:

1、支持非mapreduce应用的需求
2、可扩展性
3、提高资源是用率
4、用户敏捷性
5、可以通过搭建为高可用

YARN是做什么的

YARN在Hadoop中的功能作用有两个,第一是负责Hadoop集群中的资源管理(resource management),第二是负责对任务进行调度和监控(scheduling/monitoring)。YARN分别提供了相应的组件完成这两项工作。

如何管理资源

YARN在管理资源上采用的是master/slave架构。在整个YARN集群中,在其中一个节点上运行ResourceManager进程作为master,其余每个节点上都运行一个NodeManager进程作为slave。
ResourceManager负责对集群中的所有资源进行统一的管理和调度。NodeManager进程负责单个节点上的资源管理,它监控一个节点上的资源使用情况(如cpu,内存,硬盘,网络等)并将其report给ResourceManager。
ResourceManager有两个主要的组件:Scheduler和ApplicationsManager。
其中的Scheduler就负责为集群中运行的各个application分配所需要的资源。Scheduler只负责资源的调度,它不做任何对application监控或跟踪的工作,此外,在任务由于各种原因执行失败时,它也不负责对任务进行重启。
Scheduler根据application对资源的需求执行其资源调度功能。它将cpu、内存、硬盘、网络等资源合并成一个整体,抽象成Container进行资源分配。Container就是Scheduler进行资源分配的一个单位,也是运行各个任务的容器。
此外,Scheduler是一个可插拔的组件,用户可根据自己的需要设计新的Scheduler,YARN提供了多种可直接使用的调度器,比如Fair Scheduler和Capacity Scheduler等。

如何调度/监控任务

ApplicationMaster组件负责跟踪和管理一次提交的作业(job),它负责为job的运行向ResourceManager中的Scheduler组件申请资源,并通过NodeManger启动和监控这个job的所有task。
当向ResourceManager提交一个job时,必须为其指定一个ApplicationMaster组件。ResourceManager中的ApplicationsManager组件会对所有job的ApplicationMaster进行管理,它首先会为ApplicationMaster组件分配资源,使其运行在一个slave节点的Container中。并负责监控ApplicationMaster的运行状态,在Container出现异常时对ApplicationMaster进行重启。
ApplicationsManager负责管理整个集群中的所有job,包括job的提交、与Scheduler协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。

YARN架构

Apache Hadoop YARN
上面我们已经介绍了YARN中的全部组件的作用,现在我们详细说一下YARN的架构。
先看图中的Node Statue线,这条线展现了YARN集群的master/slave架构。ResourceManager是集群中的master节点,作为老大统一管理集群中的所有资源分配。集群中可以存在多个NodeManager节点,NodeManager负责其所在机器上的资源管理,并将资源使用情况report给ResourceManager节点。
Container是YARN中的资源抽象,它封装了一个节点上的多维度资源,如内存、CPU、磁盘、网络等。从图中可以看到,一个NodeManager节点上同时存在多个Container。提交作业的每个task都运行在一个Container中。
再看MapReduce Status和Resource Request这两条线,它展现了ApplicationMaster的作用。首先,对于每个提交的作业都必须要有一个ApplicationMaster(如这里的两个作业分别对应一个ApplicationMaster)。ApplicationMaster对作业的所有任务进行跟踪监控和管理,可以看到作业下的每个任务都将执行statue汇报给ApplicationMaster。此外,ApplicationMaster还负责向ResourceManager申请资源。
最后,Job Submission这条线展现了每次提交新的作业时,都是将任务提交给ResourceManager,由ResourceManager全局管理。常见的操作有提交一个作业、杀死一个作业等。

YARN执行流程

提交一个作业到YARN的详细执行流程如下:

  1. Client向YARN提交一个job,首先向ResourceManager中的ApplicationManager申请资源,用于运行本作业的ApplicationMaster。
  2. ApplicationManager给集群中的一个NodeManager发命令,通知其创建一个Container并运行作业的ApplicationMaster。
  3. NodeManager创建一个Container并启动作业的ApplicationMaster。
  4. ApplicationMaster将自己注册到ApplicationManager,使得ApplicationManager可以监控到Job的执行状态,Client也可以通过ApplicationManager对作业进行控制。
  5. Scheduler将资源分配信息发给ApplicationMaster。
  6. ApplicationMaster将获取到的资源分配信息发送给各个NodeManager。
  7. 各个NodeManager接收到资源分配命令,创建Container并启动对应的task。
  8. 各个task直接与ApplicationMaster进行通信,汇报心跳和任务执行进度。
  9. 所有的Task都执行完毕,将讲过反馈给ApplicationMaster。ApplicationMaster再将任务执行的结果反馈ApplicationManager。

Apache Hadoop YARN

参考: https://segmentfault.com/a/1190000018775822