Apache Yarn(Yet Another Resource Negotiator)是 Hadoop 集群资源管理器系统,Yarn 从 Hadoop 2 引入,最初是为了改善 MapReduce 的实现,但是它具有通用性,同样适用于其他分布式计算模型中。
MapReduce1 中,具有以下局限性:
1)扩展性差:在 MapReduce1 中 JobTracker 同时兼备资源管理和作业控制两个功能,这成为系统的最大瓶颈,严重制约了 Hadoop 集群扩展性(任务多时内存开销大,上限4000节点)。
2)可靠性差:MapReduce1 采用了 master/salve 结构,其中,master 存在单点故障问题,一旦它出现故障将导致整个集群不可用。
3)资源利用率低:MapReduce1 采用了基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完槽位对应的资源,且其他任务也无法使用这些空闲的资源。Hadoop1 将槽位分为 Map Slot 和 Redue Slot 两种,且不允许他们之间共享,常常会导致一种槽位资源紧张而另外一种闲置(比如一个作业刚刚提交时,只会运行 Map Slot,此时 Reduce Slot 闲置)。
4)不支持多种计算框架:不支持包括内存计算框架、流式计算框架、迭代式计算框架等。

Yarn 的基本设计思想:将 JobTracker 的两个主要功能,即资源管理和作业控制(包括作业监控容错等),分拆成两独立的进程。
资源管理进程与具体应用程序无关,它负责整个集群的资源(内存、CPU、磁盘等)管理,而作业控制进程则直接与应用程序相关的模块,且每隔作业控制进程只负责管理一个作业。这样,通过将原有 JobTracker 中与应用程序相关和无关的模块分开,不仅减轻了 JobTracker 负载,也使得 Hadoop 支持更多的计算框架。

yarn 有以下特点:
1)通用资源管理系统和调度平台,支持多计算框架
2)可扩展性强
3)提高资源利用率
4)可通过搭建为HA
Hadoop1.x 和 Hadoop2.x 的区别:

Yarn 总体上还是 Master/Slave 结构,在整个资源管理框架中,ResourceManager 为 Master,NodeManager 为 Slave,ResourceManager 负责对各个 NodeManager 上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的 ApplicationMaster,它负责向 ResourceManager 申请资源,并要求 NodeManager 启动可以占用一定资源的任务。由于不同的 ApplicationMaster 被分不到不同的节点上,因此他们之间不会互相影响。
Yarn 由以下几个组件构成:
1)ResourceManager
2)NodeManager
3)ApplicationMaster(下图给出了 MapReduce 和MPI 两种计算框架的 ApplicationMaster,分别为 MR APPMstr 和 MPI AppMstr)
4)Container

RM 是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。
调度器不在从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用执行状态等,也不负责启动因应用执行失败或者硬件故障而产生的的失败任务,这些均由应用程序相关的 ApplicationMaster 完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resouce Container,简称 Container)标识,Container 是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。
调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,Yarn 提供了多种直接可用的调度器。
FIFO Scheduler:先进先出,不考虑作业优先级和范围,适合低负载集群。
Capacity Scheduler:将资源分为多个队列,允许共享集群,有保证每个队列最小资源的使用。
Fair Scheduler:公平的将资源分给应用的方式,使得所有应用在平均情况下随着时间得到相同的资源份额。
应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动它等。
用户提交的每个应用程序均包含一个AM,主要功能包括:
NM 是每个节点上的资源和任务管理器,一方面,它会定时地向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态;另一方面,它接收并处理来自 AM 的 Container 启动/停止等各种请求。
Container 是 Yarn 中的资源抽象,它封装了某个 节点上的多维度资源,如内存、CPU、磁盘、网络等,当 AM 向 RM 申请资源时,RM 为 AM 返回的资源便是用 Container 表示的。Yarn 会为每一个任务分配一个 Container,且该任务只能使用该 Container 中描述的资源。Container 是一个动态资源划分单位,是根据应用程序的需求动态生成的。
目前 Yarn 仅支持 CPU 和 内存两种资源,且使用了轻量级资源隔离机制 Cgroups 进行资源隔离。
RPC 协议是连接各个组件的主要协议,任何两个需要互通的组件之间仅有一个 RPC 协议,RPC 协议分为 Client 和 Server端,Client 总是主动连接 Server 端。Yarn 采用的是(pull-based)通信模型。

Yarn 将分两个阶段运行该应用程序 :
第一个阶段:启动 ApplicationMaster
第二个阶段:由 ApplicationMaster 创建应用程序,为它 申请资源,并监控它的整个运行过程,直到运行完成

步骤:
小结:
可将 Yarn 看做一个云操作系统,它负责为应用程序启 动 ApplicationMaster(相当于主线程),然后再由 ApplicationMaster 负责数据切分、任务分配、 启动和监控等工作,而由 ApplicationMaster 启动的各个 Task(相当于子线程)仅负责自己的计 算任务。当所有任务计算完成后,ApplicationMaster 认为应用程序运行完成,然后退出。
