Hadoop - YARN 概述

一 概述

      Apache Hadoop YARN (Yet Another Resource Negotiator,还有一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统。可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大优点。 
                   

   
                                           Hadoop - YARN 概述

YARN最初是为了修复MapReduce实现里的明显不足,并对可伸缩性(支持一万个节点和二十万个内核的集群)、可靠性和集群利用率进行了提升。YARN实现这些需求的方式是,把Job
Tracker的两个主要功能(资源管理和作业调度/监控)分成了两个独立的服务程序——全局的资源管理(RM)和针对每一个应用的应用 Master(AM)。这样一个应用要么是传统意义上的MapReduce任务,要么是任务的有向无环图(DAG)。

          YARN从某种那个意义上来说应该算做是一个云操作系统,它负责集群的资源管理。在操作系统之上能够开发各类的应用程序,比如批处理MapReduce、流式作业Storm以及实时型服务Storm等。这些应用能够同一时候利用Hadoop集群的计算能力和丰富的数据存储模型,共享同一个Hadoop
集群和驻留在集群上的数据。

此外,这些新的框架还能够利用YARN的资源管理器,提供新的应用管理器实现。


二 YARN的组成

                                        
                                Hadoop - YARN 概述

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmd6aGVianV0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

                                             YARN的基本组成
 
YARN的核心思想 将JobTracker和TaskTacker进行分离,它由以下几大构成组件: 
        a. 一个全局的资源管理器  ResourceManager
        b. ResourceManager的每一个节点代理  NodeManager
        c. 表示每一个应用的 ApplicationMaster
        d. 每个ApplicationMaster拥有多个Container在NodeManager上执行

以下对它们做一个简单的介绍:

1. ResourceManager(RM)

         RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications
Manager。ASM)。
     
      调度器  调度器依据容量、队列等限制条件(如每一个队列分配一定的资源,最多运行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。

须要注意的是。该调度器是一个“纯调度器”,它不再从事不论什么与详细应用程序相关的工作,比方不负责监控或者跟踪应用的运行状态等,也不负责又一次启动因应用运行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完毕。调度器仅依据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource
Container。简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每一个任务使用的资源量。此外。该调度器是一个可插拔的组件,用户可依据自己的须要设计新的调度器,YARN提供了多种直接可用的调度器,比方Fair Scheduler和Capacity Scheduler等。


       应用程序管理器  应用程序管理器负责管理整个系统中全部应用程序,包含应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster执行状态并在失败时又一次启动它等。

2. ApplicationMaster(AM)

          用户提交的每一个应用程序均包括一个AM,主要功能包括:
          与RM调度器协商以获取资源(用Container表示);
          将得到的任务进一步分配给内部的任务(资源的二次分配)。
          与NM通信以启动/停止任务。
          监控全部任务执行状态,并在任务执行失败时又一次为任务申请资源以重新启动任务。
   
      当前YARN自带了两个AM实现,一个是用于演示AM编写方法的实例程序distributedshell。它能够申请一定数目的Container以并行执行一个Shell命令或者Shell脚本;还有一个是执行MapReduce应用程序的AM—MRAppMaster。

       注:RM仅仅负责监控AM,在AM执行失败时候启动它,RM并不负责AM内部任务的容错,这由AM来完毕。

  3. NodeManager(NM)
       NM是每一个节点上的资源和任务管理器,一方面。它会定时地向RM汇报本节点上的资源使用情况和各个Container的执行状态;还有一方面,它接收并处理来自AM的Container启动/停止等各种请求。

    4. Container
           Container是YARN中的资源抽象。它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示。YARN会为每一个任务分配一个Container,且该任务仅仅能使用该Container中描写叙述的资源。

     注:1. Container不同于MRv1中的slot,它是一个动态资源划分单位。是依据应用程序的需求动态生成的。
            2.  如今YARN仅支持CPU和内存两种资源,且使用了轻量级资源隔离机制Cgroups进行资源隔离。
      
            YARN的资源管理和执行框架都是按主/从范例实现的——Slave ---节点管理器(NM)执行、监控每一个节点。并向集群的Master---资源管理器(RM)报告资源的可用性状态,资源管理器终于为系统里全部应用分配资源。

        特定应用的运行由ApplicationMaster控制。ApplicationMaster负责将一个应用切割成多个任务。并和资源管理器协调运行所需的资源,资源一旦分配好,ApplicationMaster就和节点管理器一起安排、运行、监控独立的应用任务。

        须要说明的是。 YARN不同服务组件的通信方式採用了事件驱动的异步并发机制,这样能够简化系统的设计。

四 YARN 架构简析
      
   集中式架构
        集中式调度器(Monolithic Schuduler)的特点是,资源的调度和应用程序的管理功能所有放到一个进程中完毕,开源界典型的代表是MRv1 JobTracker的实现。

这样设计的缺点非常明显,扩展性差:首先,集群规模受限;其次。新的调度策略难以融入到现有代码中,比方之前仅支持MapReduce作业,如今要支持流式作业,而将流式作业的调度策略嵌入到*调度当中是一项非常难的工作。


   双层调度架构
        为了客服集中式调度器的不足,双层调度器是一种非常easy被想到的解决之道。它可看作是一种分而治之的机制或者是策略下放机制:双层调度器仍保留一个经简化的集中式资源调度器,但详细任务相关的调度策略则下方到各个应用程序调度器完毕。

这样的调度器的典型代表是Mesos或YARN。

Mesos调度器由两部分组成。各自是资源调度器和框架(应用程序)调度器,当中,资源调度器负责将集群中的资源分配给各个(应用程序),而框架(应用程序)调度器负责将资源进一步分配给内部的各个任务。用户非常easy将一种框架或者系统接入Mesos.

       
       双层调度器的特点是:各个框架调度器并不知道整个集群资源使用情况,仅仅是被动地接受资源;资源调度器仅将可用的资源推送给各个框架,而由框架自己选择是使用还是拒绝这些资源;一旦框架接受到新资源,再进一步将资源分配给其内部的任务,进而实现双层调度。然而这样的调度器也是有缺点。主要表如今下面两个方面:1.各个框架无法知道整个集群的实时资源使用情况;採用悲观锁,并发粒度小。

           具体介绍能够參考这篇论文:


五 小结
          
       随着YARN的不断发展和完好,各种类型的应用程序。包含类似MapReduce的短作业、类似Web
Service的长作业等。均可直接部署和执行在YARN上,当前YARN对外提供的接口均是底层接口,这给用户编写和调试应用程序带来了非常大的麻烦,比方无法聚集分散在各个节点上的应用程序日志、应用程序生命周期难以管理、缺乏第三方工具将一个现有的系统执行在YARN上等。仅仅有这些问题都得到非常好的解决,YARN才干够走向成熟。

上一篇:(转)《深入理解java虚拟机》学习笔记9——并发编程(一)


下一篇:HTML 01 请求过程