一、简介
-
简介
YARN(Yet Another Resource Negotiator)分布式通用资源管理框架,它作为一个专门的资源管理框架从MapReduce中分离出来,聚焦资源管理,通用性极强,适用于各种计算框架,并且具有很强的扩展性,同时支持高可用。从图中我们可以看出,YARN位于文件系统与上层计算框架之间,是资源调度和作业管理的中坚力量。
二、原理
-
系统架构
在架构上,可以很明显的看出YARN同样采用的是一个主从的架构设计。有一个主节点ResourceManager和多个从节点NodeManager。
其次YARN的核心思想是将JobTracker的两个主要职责:资源管理与作业调度进行拆分,分别交给两个不同的角色负责。一个是全局的ResourceManager,一个是每个应用一个的ApplicationMaster。ResourceManager负责全局的资源管理和调度,ApplicationMaster作为一个进程运行在NodeManager节点上,负责单个应用的作业任务管理。
最后还有作为集群整体资源抽象的Container容器。
ResourceManager:作为主节点和全局资源管理器,主要负责对集群的整体资源进行统一的管理和调度。其体现在对Container的分配管理,将系统中的资源分配给各个在集群上运行的作业。仅根据各个作业的资源需求进行分配,而资源分配的单位是Container,从而限定每个作业使用的资源量。以及负责启动ApplicationMaster,监控ApplicationMaster的运行状态并在失败时重新启动,跟踪已分配的Container的进度、状态等职责(通过心跳机制接收NodeManager的资源上报信息)。
NodeManager:NodeManager是每个节点上的资源和任务管理器,他会定时的通过心跳机制向ResourceManager汇报本节点上的资源使用情况和各个Container的运行状态,同时会接收并处理来自ApplicationMaster的各种Container启动、停止请求。
ApplicationMaster:用户向集群提交的每一个应用均包含一个ApplicationMaster, 它负责某一个作业的执行和监控。ApplicationMaster是应用框架,由用户提交,ApplicationMaster负责向ResourceManager协调资源,并且与NodeManager协同工作完成作业的执行和监控。YARN为原生计算框架MapReduce提供了ApplicationMaster的实现。也有很多分布式应用开发了对应的应用框架,用于在YARN上运行任务,如Spark的Spark on YARN。
Container:Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存,CPU,磁盘等,当ApplicationMaster向ResourceManager申请资源时,ResourceManager为ApplicationMaster返回的资源便是用Container表示的。
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注销,并关闭自己。
-
高可用
作为在Hadoop 2.X后出现的新成员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 rmadmin命令来对Resource Manager进行管理,如主备切换、获取节点状态。
三、资源调度策略
-
FIFO调度器
FIFO Schedule(先进先出调度器)是YARN的三种资源调度器之一,也是YARN的默认调度器。
先进先出调度,顾名思义就是说先提交的作业优先级高,按照作业的提交顺序进行运行。在此调度器中只有一个队列供所有用户共享,无法干涉资源的使用,FIFO Scheduler把作业按提交的顺序排成一个队列,在进行资源分配的时候,先给队列中最靠前的作业进行资源分配,之后的作业保持阻塞,以此类推。
缺点:局限性明显,资源利用率低,无法交叉运行作业。不够灵活,比如紧急的作业无法插队等,在一般生产环境中不推荐使用。
-
容量调度器
Capacity Schedule(容量调度器)该调度器用于在共享或者多租户的集群环境中使用,在最大化吞吐量的前提下对多任务的运行尽可能的友好。
Capacity Schedule支持多队列,并进一步细分,即支持层级化队列,这使得该调度器对集群资源的使用率极高,每个队列都有队列的访问权限控制,并且集群内空闲的资源可以额外分配给任何需要的队列,但是每个队列都要预设资源的分配比例,并且在每个队列的内部依然使用的是FIFO的调度策略,队列内不支持资源抢占。
特点:
1. 层次化的队列设计:自队列可是使用父队列的资源,进一步有效利用集群资源。
2. 容量保证:每一个队列都要预设资源占比,预防队列的资源独占。
3. 弹性分配:空闲的资源可以额外的分配给任何需要的队列,当出现资源争夺的情况时,会按照比例进行均衡。
4. 访问控制:每个队列都有队列的访问权限控制,用户只能向自己的队列中提交任务,不能访问没有权限的队列。
5. 多租户:多用户可共享集群资源。
6. 支持动态管理:可以动态的调整队列的容量,权限等参数,也支持动态的增加/停止队列,来增加队列数量或者阻止进一步向某个队列中提交任务。
除了直接修改配置文件,在TDH中可以直接在Transwarp Manager中对Yarn直接进行可视化配置的修改。
在WEB界面可以对每个队列进行详细的配置。队列容量表示预分配的队列资源。最大容量表示除了预分配的比例,在集群空闲的情况下最大可以获得多少资源,-1表示没有限制。
-
公平调度器
Fair Schedule(公平调度器)该调度器的思想是尽可能的公平的调度,即资源占用量少的作业尽量优先完成。在考虑如何分配资源时,Fair Schedule尽可能的使得每个应用都能够得到尽量相当的资源,并且使用该调度器无需预先设定资源的分配比例。
Fair Schedule同样是多队列,并且每个队列同样拥有队列的访问权限控制,但是他和Capacity Schedule不同的是,Fair Schedule单一队列内部不再是FIFO策略,而是采用了公平调度策略(默认),支持抢占。这种策略使得运行时间短的应用能够尽快结束,而不至于在等待资源时被饿死。另外也可以为队列配置权重,权重用于决定资源使用量的占比。
特别要注意的是,在有新任务提交后,并不是马上执行,而是等待一小段时间后开始执行,这一小段时间用于资源抢占时前一个任务释放一部分占用资源。
在TDH中,支持可视化配置,按照图示开启公平调度策略
开启公平调度策略之后,可以对公平调度器进行详细的配置。
四、运维与监控
如图中的命令,我们可以通过-list查看YARN任务列表,或者通过-kill来杀死任务,以及通过-status查看任务状态。
但是值得注意的是,已经提交到YARN中的任务,我们不能用CTRL+C的方式终止任务,只能通过-kill杀死任务的方式终止任务(使用Hadoop jar提交任务)。