Yarn分布式资源管理系统介绍

简介

Yarn(Yet Another Resource Negotiator,另一种资源协调者)是一种分布式通用资源管理系统。其的设计目标为聚焦资源管理、通用(适用于各种计算框架)、高可用、高扩展。Yarn采用Master / Slave 架构,即有一个主节点ResourceManager(RM,可以多个HA)和多个从节点NodeManager。通过这两个角色将 JobTracker的资源管理、任务调度功能分离。Yarn中包含三种角色,分别为:

  • ResourceManager(Master)
  • NodeManager(Slave)
  • ApplicationMaster(新角色):管理应用程序实例,包括任务调度和资源申请


Yarn的核心思想
将JobTracker的两个主要职责:资源管理与作业调度进行拆分,分别交给两个不同的角色负责。一个是全局的ResourceManager,一个是每个应用一个的ApplicationMaster。其中,ResourceManager负责全局的资源管理和调度。此外,ApplicationMaster作为一个进程运行在NodeManager节点上,负责单个应用的作业任务管理。最后,还有作为集群整体资源抽象的Container容器。

核心组件说明

ResourceManager全局资源管理器
ResourceManager作为主节点和全局资源管理器,主要负责对集群的整体资源进行统一的管理和调度。其体现在对Container的分配管理,将系统中的资源分配给各个在集群上运行的作业。负责启动ApplicationMaster,监控ApplicationMaster的运行状态并在失败时重新启动。跟踪已分配的Container的进度、状态等职责(通过心跳机制接收NodeManager的资源上报信息)。

ResourceManager的主要功能包括:统一管理集群的所有资源、将资源按照一定的分配策略分配给各个应用(ApplicationMaster)、接收NodeManager的资源上报信息。其核心组件有用户交互服务(user service)、NodeManager 管理、ApplicationMaster管理、Application 管理、安全管理、资源管理。

NodeManager节点资源管理器

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


NodeManager(NM)的主要功能是管理单个节点的资源,并通过心跳机制向ResourceManager汇报节点资源使用情况,与此同时还负责管理Container的生命周期。NM会接受及处理来自RM的命令请求,分配Container给应用的某个任务,处理来自ApplicationMaster的请求,执行Yarn上面应用的一些额外服务,比如Mapreduce的Shuffle过程。核心组件包括:NodeStatusUpdate、ContainerManager、ContainerExecutor、NodeHealthCheckService、Security、Webserver。

当一个节点启动时,它会向 ResourceManager 进行注册并告知 ResourceManager 自己有多少资源可用。在运行期,通过 NodeManager 和 ResourceManager 协同工作,这些信息会不断被更新并保障整个集群发挥出最佳状态。NodeManager 只负责管理自身的 Container,它并不知道运行在它上面应用的信息。负责管理应用信息的组件是 ApplicationMaster。

ApplicationManager应用程序管理器
ApplicationManager(AM)负责向ResourceManager协调资源,并且与NodeManager协同工作完成作业的执行和监控。其主要功能有管理应用程序实例,同时向ResourceManager申请任务执行所需的资源,以及任务调度和监管。

ApplicationMaster 与 ResourceManager 之间的通信是整个 Yarn 应用从提交到运行的最核心部分,是 Yarn 对整个集群进行动态资源管理的根本步骤,Yarn 的动态性,就是来源于多个Application 的 ApplicationMaster 动态地和 ResourceManager 进行沟通,不断地申请、释放、再申请、再释放资源的过程。


YARN资源调度流程详细描述:

1. 用户通过主节点ResourceManager向YARN中提交一个作业,其中包括ApplicationMaster程序,
ApplicationMaster启动命令,命令参数,用户程序等准确描述运行ApplicationMaster进程的所有信息。

2. ResourceManager为该作业分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动ApplicationMaster。

3. ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后ApplicationMaster将该作业进行切分并为各个任务向ResourceManager申请资源。

4. ResourceManager收到ApplicationMaster的请求后为这些任务分配资,但是ResourceManager并不会主动把申请到的资源交给ApplicationMaster,而是由ApplicationMaster通过心跳机制采用轮询的方式向ResourceManager领取已经分配的资源,并且这个过程是异步的(以MapReduce为例,ApplicationMaster会先拿到Map task所要用到的资源并进行执行之后,再去拿Reduce Task所要使用的资源)。

5. 一旦ApplicationMaster拿到这些资源,便会与对应的NodeManager通信,要求它们创建Container并在Container中运行切分好的各个任务(以MapReduce为例,Container中运行的就是一个Map Task或者Reduce Task)。ApplicationMaster会定时监控这些任务的状态和运行进度,以让ApplicationMaster随时掌握各个任务的运行情况,NodeManager也会定时向ResourceManager汇报自己所拥有Container的情况。

6. 当任务运行完成时,ApplicationMaster会向ResourceManager注销,并关闭自己。


YARN高可用

1. YARN的高可用实现依然是至少两台ResourceManager主节点:一台ActiveResourceManager一台StandbyResourceManager。

2. 实现主节点间的自动切换。但是YARN的高可用实现和HDFS的不同之处在于:

(1) Zookeeper既负责Active节点的选举,又负责恢复ActiveResourceManager的原有状态信息。
也就是说Zookeeper在YARN的高可用实现中,除了负责Active节点的选举之外,还负责同步ResourceManager的状态信息,来满足主备节点切换时的状态信息一致性。

(2) ResourceManager有一个内嵌的基于Zookeeper的ActiveStandbyElector去决定哪个ResourceManager应该是Active,当ActiveResourceManager宕机,另外一个ResourceManager将会自动被选举为Active,然后接手工作,并且这里不像HDFS高可用机制,我们需要启动一个ZKFC的守护进程,因为内嵌的ActiveStandbyElector已经替代ZKFC,进行失败检测,和主备切换。

Yarn资源调度器Scheduler

YARN还有一个作用就是进行资源调度,那么如何理解资源调度?

在理想情况下,应用程序提出的请求将立即得到YARN批准。但是实际中,资源是有限的,并且在繁忙的群集上,应用程序通常将需要等待其某些请求得到满足。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。 一般而言,调度是一个难题,并且没有一个“最佳”策略,为此,YARN提供了多种调度器和可配置的策略供选择。

三种调度器策略

Yarn中提供了三种调度器,FIFO Scheduler(先进先出调度器)、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)。Apache版本YARN默认使用Capacity Scheduler。

(1) FIFO Scheduler

FIFO Scheduler(先进先出调度器)是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。FIFO Scheduler拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的资源信息作用于这个全局的queue。

优势:无需配置、先到先得、易于执行

缺点:资源利用率低,无法交叉运行任务;灵活性差

(2) Capacity Schedule
Capacity Schedule(容量调度器)该调度器用于在共享或者多租户的集群环境中使用,在最大化吞吐量的前提下对多任务的运行尽可能的友好。容量调度是Apache Hadoop 3.x默认调度策略,该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。Capacity可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。

Capacity Schedule(容量调度器)特点:

a. 层次化的队列设计:自队列可是使用父队列的资源,进一步有效利用集群资源。

b. 容量保证:每一个队列都要预设资源占比,预防队列的资源独占。

c. 弹性分配:空闲的资源可以额外的分配给任何需要的队列,当出现资源争夺的情况时,会按照比例进行均衡。

d. 访问控制:每个队列都有队列的访问权限控制,用户只能向自己的队列中提交任务,不能访问没有权限的队列。

e. 多租户:多用户可共享集群资源。

f. 支持动态管理:可以动态的调整队列的容量,权限等参数,也支持动态的增加/停止队列,来增加队列数量或者阻止进一步向某个队列中提交任务。

(3) Fair Scheduler
Fair Schedule(公平调度器)该调度器的思想是尽可能的公平的调度,即资源占用量少的作业尽量优先完成。在考虑如何分配资源时,Fair Schedule尽可能的使得每个应用都能够得到尽量相当的资源,并且使用该调度器无需预先设定资源的分配比例。公平调度可以在多个队列间工作,允许资源共享和抢占。

优势

  • 分层队列:队列可以按层次结构排列以划分资源,并可以配置权重以按特定比例公平共享集群资源。
  • 资源抢占:终止其他队列的任务,使其让出所占资源,然后将资源分配给资源占有量少于最小限制的队列。
  • 通过平分的方式,动态分配资源
  • 队列内可配置的策略有:FIFO、Fair
  • 队列权重:当有任务在等待,并且集群中有空闲资源,每个队列可以根据权重获得不同比例的资源。
  • 默认不限制每个队列和用户可以同时运行应用的数量。可以配置来限制队列和用户并行执行的应用数量,限制并行执行应用数量不会导致任务提交失败,超出的应用会在队列中等待。


注意:
已经提交到YARN中的任务,我们不能用CTRL+C的方式终止任务,
只能通过-kill杀死任务的方式终止任务(使用Hadoop jar提交任务)。

总结

Yarn作为一个通用的资源管理平台,简单总结有两大块功能,一个是为计算任务分配CPU、内存等计算资源,另外一个是计算任务该什么时候调度运行。但是它的格局更大,只要实现Yarn提供的编程规范,不仅能运行MapReduce计算任务,还可以运行其他比如Spark、Flink等其他产品的计算任务。所以这是一个非常优秀的平台,或者说框架。

评论
登录后可评论
发布者
icon
扬仔无敌
文章
31
问答
119
关注者
10
banner
关注星环科技
获取最新活动资讯

加入TDH社区版技术交流群

获取更多技术支持 ->

扫描二维码,立即加入