理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。在Yarn中,负责给应用分配资源的就是Scheduler。其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。为此,Yarn提供了多种调度器和可配置的策略供我们选择。

Capacity Scheduler(容量调度器)

对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。用这个资源调度器,就可以配置yarn资源队列,这个后面后介绍用到。

Fair Scheduler(公平调度器)

Fair调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。当然,公平调度在也可以在多个队列间工作。

举个例子,假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。

在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。

a) 公平调度器,就是能够共享整个集群的资源

b) 不用预先占用资源,每一个作业都是共享的

c) 每当提交一个作业的时候,就会占用整个资源。如果再提交一个作业,那么第一个作业就会分给第二个作业一部分资源,第一个作业也就释放一部分资源。再提交其他的作业时,也同理。。。。也就是说每一个作业进来,都有机会获取资源。

Yarn调度器和调度算法

目前,Hadoop作业调度器主要有三种: FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。

Apache Hadoop-1.x默认调度器是FIFO;

Apache hadoop-2.7.2之后默认调度器是容量调度器Capacity Scheduler

Apache hadoop-3.2.2默认调度器是公平调度器Fair Scheduler。

CDH 框架默认调度器是 Fair Scheduler。

一、容量调度器(Capacity Scheduler)

1. 容量调度器特点

img

  1. 多队列 :每个队列可配置一定的资源量,每个队列内部采用FIFO调度策略;
  2. 容量保证:管理员可为每个队列设置资源最低保证和资源使用上线;
  3. 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列;
  4. 多租户:

a. 支持多用户共享集群和多应用程序同时运行;

b. 为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定。

2. 容量调度器资源分配算法

img

二、公平调度器(Fair Scheduler)

1. 公平调度器特点

img

与容量调度器相同点:

  1. 多队列 :每个队列可配置一定的资源量。

  2. 容量保证:管理员可为每个队列设置资源最低保证和资源使用上线;

  3. 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列;

  4. 多租户:

    1. 支持多用户共享集群和多应用程序同时运行;
    2. 为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定。

与容量调度器不同点:

核心调度策略不同

容量调度器: 优先选择资源利用率低的队列;

公平调度器:优先选择对资源缺额比例大的。

每个队列可以单独设置资源分配方式

容量调度器:FIFO、DRF(内存+CPU);

公平调度器:FIFO、FAIR、DRF。

队列任务平行度不同

公平调度器:多队列,同一时间队列中多任务按照缺额执行,队列并行度大于队列个数

容量调度器:多队列,同一时间队列中只有一个任务执行,队列中按照先进先出分配任务,队列并行度等于队列个数。

Fair策略

Fair策略是公平调度器默认的队列分配方式

img