Yarn 作为 Hadoop 的资源管理系统,负责 Hadoop 集群上计算资源的管理和作业调度。

Yarn 支持 CPU 和 内存两种资源管理和调度,通过对资源抽象为 Container,封装了某个节点上一定量的 CPU 资源和内存资源。内存资源决定计算任务的存活,如果内存不够,计算任务可能运行失败;相比之下,CPU资源则不同,它只会决定任务的快慢,不会对任务的生死产生影响。

Container 在 Hadoop3.x 版本之前只支持内存和 CPU 资源,Hadoop 3.x 开始支持自定义资源类型,极大的增强了资源管理的能力

一、 Yarn 架构

YARN 是经典的 主从 Master/Slave 结构,如下图所示。

Yarn 服务由一个 ResourceManager 和多个 NodeManager 构成,ResourceManager为主节点 (master),NodeManager 为从节点(slave)

1.1. ResourceManager

ResourceManager 是一个全局的资源管理器,负责整个系统的资源管理和分配,包括处理客户端请求、启动/监控 AppMaster、监控 NodeManager、资源的分配与调度。

主要由两个组件构成: 调度器(Scheduler)和应用程序管理器(ApplicationManager)

每个 Hadoop 集群只会有一个 ResourceManager (如果是 HA 的话会存在两个,但是有且只有一个处于 active 状态),它负责管理整个集群的计算资源,并将这些资源分别给应用程序。ResourceManager 内部主要有两个组件:

1.1.1. ResourceScheduler

资源调度,为Application分配资源,目前 YARN 提供了FIFO、容量以及公平资源调度器

ResourceScheduler 并不对作业进行监控;

1.1.2. ApplicationsManager

ApplicationManager接受客户端提交的请求,在节点中启动 Application Master,并监控Application Master的状态并在失败时重新启动它

1.2. NodeManager

NodeManager 管理集群中单个节点上的资源,定期向 ResourceManager 发送心跳信息来更新其健康状态

1.3. ApplicationMaster

ApplicationMaster 是应用程序级别的,每个 ApplicationMaster 管理运行在 YARN 上的应用程序。

ApplicationMaster 负责和 ResourceManager scheduler 协商资源,并且和 NodeManager 通信来启动 Container 运行 task,并且监控 Container 的运行进度。当 Container 运行完成, ApplicationMaster 将会向 ResourceManager 注销这个容器;如果是整个作业运行完成,其也会向 ResourceManager 注销自己,这样这些资源就可以分配给其他的应用程序使用了。

二、调度器

资源调度是 Yarn 作为一个资源管理系统,资源调度由 ResourceManager 完成,而资源隔离由各个 NodeManager 实现。ResourceManager 将某个 NodeManager 上资源分配给任务后,NodeManager 需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础和保证,这就是所谓的资源隔离。

2.1. FIFO 队列调度器

所有的作业被统一提交到一个队列中,Hadoop 按照提交顺序依次运行这些作业

2.2. 公平调度器

Fair 调度器的设计目标是为所有的应用分配公平的资源。

目标是让每个用户公平地共享集群能力。如果只有一个作业运行,它会得到集群的所有资源。随着提交的作业越来越多,空闲的任务槽会以“让每个用户公平共享集群”这种方式进行分配。

公平调度器共享整个集群的资源,不预先占用资源,每一个计算作业都是共享的,每当提交一个作业的时候,就会占用整个计算资源。如果再提交一个作业,那么第一个作业就会分给第二个作业一部分资源,第一个作业也就释放一部分资源,每一个作业进来,都有机会获取资源。

2.3. 容量调度器

容量调度器以队列为单位划分计算资源,每个队列可设定一定比例的资源最低保证和使用上限,默认只有一个 default 队列,一般可以按照计算引擎创建队列 Hive、Spark、Flink等,也可以以业务来划分任务队列

Fair Scheduler提供了一个基于任务数的负载均衡机制,该机制尽可能将系统中的任务均匀分配到各个节点上

在提交任务时默认选择资源占用率最低的队列分配任务,也可以指定任务队列,提交到该队列的任务共享这些资源

当某个队列中有剩余资源时,调度器会将这些资源共享给其他队列,而当该队列中有新的应用程序提交时,调度器要为它回收资源。

为了尽可能降低不必要的计算浪费,调度器采用了先等待再强制回收的策略,即如果等待一段时间后尚有未归还的资源,则会进行资源抢占;从那些超额使用资源的队列中杀死一部分任务,进而释放资源

同时支持多用户,多application应用的job同时运行,为了防止一个用户的作业独占该队列的大部分资源,调度器可以调整配置每个用户提交的作业的资源的比列。避免单队列堵塞等待,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源。

  • 资源公平共享

    在每个队列中,Fair Scheduler可选择按照FIFO、Fair或DRF策略为应用程序分配资源。Fair策略即平均分配,默认情况下,每个队列采用该方式分配资源

  • 支持资源抢占

    当某个队列中有剩余资源时,调度器会将这些资源共享给其他队列,而当该队列中有新的应用程序提交时,调度器要为它回收资源。为了尽可能降低不必要的计算浪费,调度器采用了先等待再强制回收的策略,即如果等待一段时间后尚有未归还的资源,则会进行资源抢占;从那些超额使用资源的队列中杀死一部分任务,进而释放资源

  • 负载均衡:Fair Scheduler提供了一个基于任务数的负载均衡机制,该机制尽可能将系统中的任务均匀分配到各个节点上。此外,用户也可以根据自己的需求设计负载均衡机制

  • 调度策略灵活配置:Fiar Scheduler允许管理员为每个队列单独设置调度策略(当前支持FIFO、Fair或DRF三种)

  • 提高小应用程序响应时间:由于采用了最大最小公平算法,小作业可以快速获取资源并运行完成

为每个队列设置资源最低保证和资源使用上限,

FIFO Scheduler 是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用 Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。在 FIFO 调度器中,小任务会被大任务阻塞。

三、 资源调度流程