今天原来项目交接的同事过来询问hadoop集群运维相关的事情,重新检查了一下集群的各个配置项,由于时间太久,对其中yarn的资源调度配置细节有点记不清了,因此查阅了调度器相关资料,同时回忆了当初调度策略方案的选择过程,整理之后在这里记一下来龙去脉,以防今后又忘掉了。
1. 为什么需要调度器
2. 都有哪些调度器
3个调度器的区别请看下图:
上图假设job1需要集群全部的资源。
FIFO Scheduler会把所有资源都给先提交的job1,后面提交的任务将全部阻塞。
Capacity Scheduler可以配置多个队列,每个队列分配固定数量的资源,上图当中job1提交到队列A,job2提交到队列B,因此两个job可以同时执行。但这里有个问题,当其他队列空闲时,job1也只能使用队列A的资源,空闲资源白白浪费。
Fair Scheduler会为所有运行的job动态调整资源分配,当只有job1运行时,把所有资源都给job1,当job2开始运行时,分配一半的资源给job2,job2结束后,又把空闲下来的资源分配给了job1。这样既能保证小任务及时完成,又能避免资源的空闲浪费。
当然,现在Fair Scheduler的配置已经非常灵活了,也可以像Capacity Scheduler那样支持多个队列,多个队列的场景下资源分配如下图:
有没有看起来好像很不错的样子?
3. 我采用的方案
yarn.resourcemanager.scheduler.class
yarn.scheduler.fair.user-as-default-queue