理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但实际情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能得到相应的资源。在yarn中,负责给应用分配资源的就是scheduler。其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。为此,yarn提供了多种调度器和可配置的策略供我们选择。
在yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler。
FIFO Scheduler
- FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配时,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
- FIFO Scheduler是最简单也是最容易理解的调度器,不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其他应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或FairScheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
- 在上图的示例中,有一个很大的job1,它先提交,并且占据了全部的资源,那么job2提交时发现没有资源了,则job2必须要等job1执行结束,才能获得资源执行。
- 在FIFO调度器中,小任务会被大任务阻塞。
Capacity Scheduler
- 对于Capacity Scheduler,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时机会落后于FIFO调度器的时间。
Fair Scheduler
- 在Fair调度器中,不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如上图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
- 需要注意的是,在上图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器既得到了高的资源利用率又能吧总小任务及时完成。