一.Yarn的介绍

    Yarn是Hardoop集群的资源管理系统,是Hardoop2.0对MapReduce框架做的设计重构,我们称Hardoop2.0中的MapReduce为MRv2或者Yarn。在Hardoop1.0中MapReduce主要包括两个部分:1.ResourceManagement——资源管理;2.JobScheduling/JobMonitoring——任务调度监控。而到了Hardoop2.0,也就是Yarn,它将这两部分功能分开,分别用两个进程来管理这两个任务:1.ResourceManager;2.ApplicationMaster。

    在Hardoop1.0中,运行在Hardoop中的都是MapReduce应用,而Hardoop2.0的Yarn拓展了Hardoop,使得它不仅仅支持MapReduce计算,还很方便的管理Hive、HBASE、Spark等应用。所以,在Yarn中,把job的概念换成了application。这种新架构的设计就是让各类应用都运行在Hardoop上,通过Yarn在系统层面进行统一的管理,各应用可以互不干扰的运行在同一个Hardoop系统中,共享这个集群的资源。

    二.Yarn的组件

    Container是Yarn对计算机所有资源,包括CPU和内存 资源。而运行在Yarn的每个应用都有一个ApplicationMaster,它的主要作用就是像ResourceManager申请计算资源——Container,并且和NodeManager交互来 执行和 监控具体的task。Scheduler是ResourceManager进行资源管理的一个组件,负责分配给NodeManager上的Container资源,NodeManager也会不断地把自己节点上的Container使用情况反馈给ResourceManager.

    1.Container

    Container是Yarn的资源,包括CPU和内存单元,是具体执行task的基本单元。Container和集群几点的关系是:一个节点会运行多个Container,但是一个Container不会跨节点。

    2.NodeManager

    NodeManager进程运行在集群中的节点上,每个节点都会有自己的NodeManager。当一个节点启动时,它会向ResourceManager进行注册并告知ResourceManager自己有多少资源可用。在运行期,通过NodeManager和ResourceManager协同工作,这些信息会不断被更新并保障整个集群发挥出最佳状态。NodeManager作用如下:

    - 接收ResourceManager的请求,分配Container给应用的某个任务
    - 和ResourceManager交换信息以确保整个集群平稳运行。ResourceManager就是通过收集每个NodeManager的报告信息来追踪整个集群健康状态的,而NodeManager负责监控自身的健康状态。
    - 管理每个Container的生命周期
    - 管理每个节点上的日志
    - 执行Yarn上面应用的一些额外的服务,比如MapReduce的shuffle过程

    NodeManager只负责管理自身的Container,它并不知道运行在它上面应用的信息。负责管理应用信息的组件是ApplicationMaster

    3.ResourceManager

    ResourceManager主要有两个组件:Scheduler和ApplicationManager。Scheduler是一个资源调度器,它主要负责协调集群中各个应用的资源分配,保障整个集群的运行效率。Scheduler的角色是一个纯调度器,它只负责调度Containers,不会关心应用程序监控及其运行状态等信息。同样,它也不能重启因应用失败或者硬件错误而运行失败的任务另一个组件ApplicationManager主要负责接收job的提交请求,为应用分配第一个Container来运行ApplicationMaster,还有就是负责监控ApplicationMaster,在遇到失败时重启ApplicationMaster运行的Container。

    4.ApplicationMaster

    ApplicationMaster的主要作用是向ResourceManager申请资源并和NodeManager协同工作来运行应用的各个任务然后跟踪它们状态及监控各个任务的执行,遇到失败的任务还负责重启它。在MR1中,JobTracker即负责job的监控,又负责系统资源的分配。而在MR2中,资源的调度分配由ResourceManager专门进行管理,而每个job或应用的管理、监控交由相应的分布在集群中的ApplicationMaster,如果某个ApplicationMaster失败,ResourceManager还可以重启它,这大大提高了集群的拓展性。

    三.Yarn和MapReduce相比的优势:

    - 这个设计大大减小了 ResourceManager 的资源消耗,并且让监测每一个 Job 子任务 (tasks) 状态的程序分布式化了,更安全、更优美。
    - 在新的 Yarn 中,ApplicationMaster 是一个可变更的部分,用户可以对不同的编程模型写自己的 AppMst,让更多类型的编程模型能够跑在 Hadoop 集群中,可以参考 hadoop Yarn 官方配置模板中的 ``mapred-site.xml`` 配置。

    - 对于资源的表示以内存为单位 ( 在目前版本的 Yarn 中,没有考虑 cpu 的占用 ),比之前以剩余 slot 数目更合理。

   - 老的框架中,JobTracker 一个很大的负担就是监控 job 下的 tasks 的运行状况,现在,这个部分就扔给 ApplicationMaster 做了,而 ResourceManager 中有一个模块叫做 ApplicationsManager,它是监测 ApplicationMaster 的运行状况,如果出问题,会将其在其他机器上重启。

    - Container 是 Yarn 为了将来作资源隔离而提出的一个框架。这一点应该借鉴了 Mesos 的工作,目前是一个框架,仅仅提供 java 虚拟机内存的隔离 ,hadoop 团队的设计思路应该后续能支持更多的资源调度和控制 , 既然资源表示成内存量,那就没有了之前的 map slot/reduce slot 分开造成集群资源闲置的尴尬情况。