写在前面

接下来学习Hadoop生态系统中的第三个重要组成部分YARN。本篇主要学习YARN的产生背景、YARN是什么以及YARN的架构设计等内容,可以快速入门YARN。

YARN产生背景

MapReduce1.0存在的问题

首先来看一张图,该图是Hadoop1.x中MapReduce的构成结果,如下所示:

我们知道在Hadoop1.x中,MapReduce是Master/Slave(主从)结构,在集群中的表现形式为一个JobTracker带多个TaskTracker。其中JobTracker负责资源管理和作业调度,TaskTracker定期向JobTracker汇报本节点的健康、资源使用、任务执行等情况以及接收和执行来自JobTracker的操作指令,如启动/杀死任务等。

显然上述结构存在明显的问题:
(1)单节点故障。由于JobTracker节点只有一个,因此如果该节点不可用,将会导致整个集群不可用;
(2)节点压力大。JobTracker负责接收来自各个TaskTracker节点的RPC请求,因此该节点上的请求压力很大,限制了集群的扩展,且随着节点规模增大,JobTracker必定会成为瓶颈;
(3)兼容性很差。JobTracker仅仅支持MapReduce计算框架,不兼容其他类型的计算框架,而MapReduce仅仅是一个基于Map和Reduce的适合批处理、基于磁盘的计算框架,因此兼容性需要考虑。

资源使用率

正如前面所述,在YARN框架诞生之前,是一个集群一个计算框架。如Hadoop一个集群、Spark一个集群、HBase一个集群,这样极易造成各个集群管理复杂,降低资源的使用率。正是由于缺乏对资源的统一调度,很容易出现在某个时间段内Hadoop集群资源使用率高,而Spark或者HBase集群几乎处于空闲的场景。

我们希望有这么一个框架,它可以将所有的计算框架运行在一个集群中,共享一个集群的资源,然后按需要进行分配。如Hadoop需要资源,就将资源分配给Hadoop集群;HBase需要资源,就将资源分配给HBase集群,毫无疑问这样整个集群中的资源使用率肯定高于多个小集群的资源使用率。

数据共享

我们知道,随着数据量的暴增,跨集群间的数据移动不仅需要花费更长的时间,而且也会增加硬件成本。如果采用共享集群模式,那么它可以让多种框架来共享数据(数据存放在HDFS中)和硬件资源,将大大减少数据移动带来的成本。

这就是所谓的移动计算要比移动数据优势更为突出的原因之一,在作业进行任务调度时,将作业尽可能地分配到数据所在的节点上去运行,以减少数据在网络上传输所带来的开销。

YARN是什么

YARN概述

Apache Hadoop YARNYet Another Resource Negotiator,另一种资源协调者)是一种新的Hadoop资源管理器,同时也是一个通用的资源管理系统,可为上层应用提供统一的资源管理和调度。它的诞生就是为了解决集群在资源使用了、统一管理和数据共享等方面存在的各种问题。

YARN是随着Hadoop发展而催生的新框架,它取代了之前Hadoop1.x中JobTracker的角色。前面也说JobTracker单节点设计,导致其任务过重(负责任务的调度、跟踪和失败重启等过程),且只能运行MapReduce作业,不兼容其他的计算框架,因此限制了JobTracker的使用范围。而YARN就是为了解决上述问题而诞生的新框架。

YARN结构

YARN由ClientResourceManager(简称RM)、NodeManager(简称NM)、ApplicationMaster(简称AM)四部分组成,依旧采用了Master/Slave(主从)结构,且一个ResourceManager对应多个NodeManager,其架构如下所示:

简单解释一下上述架构图中各个结构运行流程:

  • ClientResourceManager提交任务、终止任务等。
  • 可以看到图中并没有ApplicationMaster,那是因为ApplicationMaster由对应的应用程序完成。每一个应用程序对应一个ApplicationMasterApplicationMasterResourceManager申请资源,用于在NodeManager上启动相应的任务。
  • NodeManager通过心跳信息向ResourceManager汇报自身的健康状况、任务执行情况、领取任务等情况。
  • Map Task对应的是MapReduce作业启动时产生的Map任务,MPI Task是MPI框架对应的执行任务。MPI是消息传递接口,可以将其理解为一种更原生的分布式模型。

    YARN核心组件功能

    通过上面对YARN架构图的分析,我们知道YARN中有四个较为核心的组件:ResourceManager(简称RM)、NodeManager(简称NM)、ApplicationMaster(简称AM)和Container,接下来将介绍这四个部分的功能。
    ResourceManager
    可以看到整合集群中只有一个ResourceManager,它负责整个集群资源的统一管理和调度。具体的作用如下所示:
    (1)处理来自客户端的请求,如启动或终止应用程序。
    (2)启动/监控ApplicationMaster。一旦某个AM出现故障,RM将会在另一个节点上启动该AM。
    (3)监控NodeManager。接收NodeManager汇报的心跳信息并分配任务给NodeManager去执行。一旦某个NM出现故障,会标记一下该NM上的任务,来告诉对应的AM应该如何处理。
    NodeManager
    可以看到整个集群中存在多个NodeManager,它负责单个节点的资源管理和使用。具体的作用如下所示:
    (1)周期性向ResourceManager汇报本节点上的资源使用情况和各个Container的运行状态。
    (2)接收并处理来自ResourceManagerContainer启动/终止的各种命令。
    (3)处理来自ApplicationMaster的命令。
    ApplicationMaster
    每个应用程序对应一个ApplicationMaster,它负责管理应用程序。具体的作用如下所示:
    (1)数据切分。
    (2)为应用程序/作业向ResourceManager申请资源(Container),并分配给内部任务。
    (3)与NodeManager通信,以启动/停止任务。
    (4)任务监控和容错。在任务执行失败时,重新为该任务申请资源以重启任务。
    (5)处理ResourceManager发过来的命令,如终止Container,重启NodeManager等。
    Container
    Container是对任务运行环境的抽象。Container里面包括任务运行资源,如节点、内存、CPU等;任务启动命令;任务运行环境等。

同时任务是运行在Container中的,一个Container中既可以运行ApplicationMaster,也可以运行具体的MapReduceMPISpark Task等。

YARN架构设计

YARN工作原理

下面是YARN的工作原理图:

这里对上述原理图中各个步骤的执行流程进行分析:
(1)用户通过Client向YARN中提交应用程序/作业,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
(2)ResourceManager为作业分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动该作业的ApplicationMaster
(3)ApplicationMaster首先向ResourceManager注册,这样用户就可以直接通过ResourceManager来查询作业的运行状态。之后将为各个任务申请资源并监控任务的运行状态,直到运行结束,也就是重复后续(7)这个步骤。
(4)ApplicationMaster采用轮询的方式通过RPC请求向
ResourceManager申请和获取资源。
(5)一旦ApplicationMaster申请到资源,便于对应的NodeManager通信,要求它启动任务。
(6)NodeManager启动任务。
(7)各个任务通过RPC协议向ApplicationMaster汇报自己的状态和进度,以便ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在作业运行过程中,用户可随时通过RPC向ApplicationMaster查找作业当前运行状态。
(8)作业完成后,ApplicationMasterResourceManager注销并关闭自己。

YARN容错性

(1)ResourceManager:基于Zookeeper实现高可用机制(High Available,HA)避免单节点故障。
(2)NodeManager:执行失败后,ResourceManager将失败任务告诉对应的ApplicationMaster,由ApplicationMaster来决定如何处理失败的任务。
(3)ApplicationMaster:执行失败后,由ResourceManager负责重启。ApplicationMaster需处理内部任务的容错问题,并保存已经运行完成的Task,重启后无需重新运行。

YARN设计目标

YARN作为通用的、统一的资源管理系统,YARN可以实现如下功能:
(1)同时运行长应用程序,也就是永不停止的程序,如Service、HTTP Server等.
(2)运行短应用程序,如小时、分、秒内运行结束的程序,MR job、Spark job等。
(3)打造以YARN为核心的生态圈:

上图中的HDFS2是指基于HDFS之上的HA和Federation等新特性,这个在下一篇进行学习。

在使用YARN框架后,开发者可以在YARN上运行各种不同框架的作业:如离线计算框架MapReduce;DAG计算框架Tez;流式计算框架Storm;内存计算框架Spark等。

那么本篇关于YARN入门内容的学习就到此为止,后续学习其他内容。