1.Yarn简介


(1)经典Hadoop1.X问题


     在Hadoop1.X版本时的资源调度是由一个主节点JobTracker和多个从节点TaskTracker来协同完成,可以看出它是一个主从架构。其中


  • JobTracker负责 资源管理和作业调度
  • TaskTracker负责汇报本节点的健康状况、资源使用、任务执行情况和执行JobTracker的命令,如启动、停止任务等。

    最大的问题在资源管理策略:


资源过度消耗,又限制了集群的扩张。随着节点规模的增大,成为了集群的瓶颈。


    ②典型单点故障,发生故障集群都崩。


Map Task Slot和Reduce Task Slot两类, 并且TaskTracker仅仅把Task的数量看做资源,并没有考虑CPU、内存等实际资源


    ④ 扩展性较差。因为JobTrackerHadoop1.X资源管理策略仅支持MapReduce计算框架 (Hadoop1.X中NameNode节点管理的元信息有限,而JobTracker只允许有一个,导致管理的节点有限)




资源管理框架YARN的原理和作用 资源管理架构_yarn


【补充:JobTracker和NameNode区别】

  • NameNode主要用于管理元数据信息及DataNode运行管理,不涉及到具体存储数据和计算框架
  • JobTracker站在计算框架的角度,一般计算分为资源管理和任务调度(哪个节点完成任务)。但JobTracker这一点做的不理想。

(2)Yarn设计目标


    Yarn诞生就是为了解决 资源管理和任务调度。 YARN(Yet Another Resource Negotiator)分布式通用资源管理框架,它作为一个专门的资源管理框架从MapReduce中分离出来,聚焦资源管理,通用性极强,适用于各种计算框架,并且具有很强的扩展性,同时支持高可用。从图中可知:


   原有Hadoop框架被分分解为资源管理(Yarn)、数据存储(HDFS、Hbase)、计算(MapReduce)


 

资源管理框架YARN的原理和作用 资源管理架构_mapreduce_02

2.Yarn架构原理


(1)Master/Slave架构思想


    ①经典主从架构:有一个主节点ResourceManager和多个从节点NodeManager。


ResourceManager负责全局的资源管理和调度,ApplicationMaster作为一个进程运行在NodeManager节点上,负责单个应用的作业任务管理


    ③集群资源容器Container:参考Docker容器和Kubernetes管理容器原理


 

资源管理框架YARN的原理和作用 资源管理架构_yarn_03

(2)架构角色

①资源管理:ResourceManager(RM)

 作为主节点和全局资源管理器,主要负责管理和调度集群的整体资源。

  • 对Container的分配管理,将系统资源(内存、CPU)分配给各个在集群上运行的作业。首先确定作业需要多少资源,然后将资源分配给Container (作业和容器类似线程和进程的关系),从而限定每个作业使用的资源量。
  • 监控ApplicationMaster的运行状态并在失败时重新启动,跟踪已分配的Container的进度和状态等职责(通过 心跳机制接收NodeManager的资源上报信息)。


资源管理框架YARN的原理和作用 资源管理架构_spark_04



②容器管理:NodeManager(NM)


     NodeManager是每个节点上的资源和任务管理器,他会定时的通过 心跳机制向ResourceManager汇报本节点上的 资源使用情况和各个Container的运行状态,同时 会接收并处理来自ApplicationMaster的各种Container启动、停止请求


资源管理框架YARN的原理和作用 资源管理架构_hadoop_05


③应用管理:ApplicationMaster(AM)


    用户向集群提交的每一个应用均包含一个ApplicationMaster, 它负责某一个作业的执行和监控。ApplicationMaster是应用框架,由用户提交,ApplicationMaster负责向ResourceManager协调资源,并且与NodeManager协同工作完成作业的执行和监控。YARN为MapReduce和Spark等计算框架提供了ApplicationMaster的实现。


【待补充思考:到底什么是应用?】

资源管理框架YARN的原理和作用 资源管理架构_yarn_06

(3)工作机制

  1. 程序提交:用户通过主节点RM向YARN中提交一个作业,其中包括AM程序,AM启动命令,参数,用户程序等准确描述运行AM进程的信息。
  2. 启动AM:RM为该作业分配第一个Container,并与对应的NM通信,要求它在这个Container中启动AM。        
  3. 注册AM申请资源:AM首先向RM注册(这样用户以后能在RM查看应用程序的运行状态)然后AM将切分作业并为多个任务向RM申请资源
  4. 分配AM资源:RM收到AM的请求后为这些任务分配资源,但是RM并不会主动把申请到的资源交给AM,而是由AM通过心跳机制采用轮询的方式向RM领取已经分配的资源,并且这个过程是异步的以MapReduce分步骤拿资源为例:AM会先拿到Map task所要用到的资源并进行执行之后,再去拿Reduce Task所要使用的资源)。 
  5. 协调容器各任务资源一旦AM拿到资源,便会与NM通信,要求它们创建Container并在Container中运行切分好的各个任务(以MapReduce为例,Container中运行的就是一个Map Task或者Reduce Task)。AM会定时监控这些任务的状态和运行进度,以让AM随时掌握各个任务的运行情况,NM也会定时向RM汇报自己所拥有Container的情况(如每个Spark任务运行时,我们可以看到DAG运行图)。
  6. 释放资源:当任务运行完成时,AM会向RM注销,并关闭自己

资源管理框架YARN的原理和作用 资源管理架构_yarn_07

3.Yarn高可用原理


(1)高可用架构


    ①与HDFS相同点:YARN的高可用依然是至少两台ResourceManager主节点:一台ActiveResourceManager一台StandbyResourceManager。 然后实现主节点间的自动切换。


    ②不同点:


  • 也就是说Zookeeper在YARN的高可用实现中,除了负责Active节点的选举之外,还负责同步ResourceManager的状态信息,来满足主备节点切换时的状态信息一致性
  • ActiveStandbyElector去决定哪个ResourceManager应该是Active。当ActiveResourceManager宕机,另外一个ResourceManager将会自动被选举为Active,然后接手工作,并且这里不像HDFS高可用机制, 我们需要启动一个ZKFC的守护进程,因为内嵌的ActiveStandbyElector已经替代ZKFC,进行失败检测,和主备切换


资源管理框架YARN的原理和作用 资源管理架构_yarn_08


4.Yarn调度策略(核心)


(1)FIFO调度

  • 默认调度器。
  • 只有一个队列供所有用户共享,无法干涉资源的使用。按提交的顺序排成一个队列,在进行资源分配的时候,先给队列中最靠前的作业进行资源分配,之后的作业保持阻塞,以此类推。

    ①优点:实现容易。


缺点:资源利用率低,无法交叉运行作业。不够灵活,比如紧急的作业无法插队等,在一般生产环境中不推荐使用。

 

资源管理框架YARN的原理和作用 资源管理架构_资源管理框架YARN的原理和作用_09

(2)Capacity Scheduler调度(重点技术)


支持层级化队列,这使得该调度器对集群资源的使用率极高。 每个队列都有队列的访问权限控制,并且集群内空闲的资源可以额外分配给任何需要的队列但是每个队列都要预设资源的分配比例,并且 在每个队列的内部依然使用的是FIFO的调度策略队列内不支持资源抢占


    【特点如图】


     ①优点:用于在共享或者多租户的集群环境中使用,在最大化吞吐量的前提下对多任务的运行尽可能的友好。  

缺点:待补充。

资源管理框架YARN的原理和作用 资源管理架构_hadoop_10

资源管理框架YARN的原理和作用 资源管理架构_hadoop_11


(3)Fair Scheduler调度(“抢占式公平”)


  • 核心思想: 尽可能的公平的调度,即资源占用量少的作业尽量优先完成。尽可能的使得每个应用都能够得到尽量相当的资源,并且使用无需预先设定资源的分配比例。
  • Fair Schedule单一队列内部不再是FIFO策略,而是采用了公平调度策略(默认),支持抢占。这种策略使得 运行时间短的应用能够尽快结束,而不至于在等待资源时被饿死(短作业优先级更高)
  • 为队列配置权重,权重用于决定资源使用量的占比。 特别要注意的是,在 有新任务提交后,并不是马上执行,而是等待一小段时间后开始执行,这一小段时间用于资源抢占时前一个任务释放一部分占用资源。


资源管理框架YARN的原理和作用 资源管理架构_spark_12