yarn FairScheduler 与 CapacityScheduler
CapacityScheduler(根据计算能力调度)
- CapacityScheduler 允许多个组织共享整个集群, 每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列, 然后再为每个队列分配一定的集群支援, 这样整个集群就可以通过设置多个队列的方式给多个组织提供服务。此外, 队列内部又可以垂直划分, 这样一个组织内部的多个成员就可以共享该队列资源了, 在一个队列内部, 资源的调度采用的是FIFO(First In First Out)策略。
- CapacityScheduler特点:
- 容量保证: 可以为每个队列设置资源最低量核对资源使用上限, 所有提交到该队列的程序共享该队列中的资源(注意: 最小容量并不是“总会保证最低容量", 可能会借给其他节点)
- 灵活性: 如果一个队列中的资源有剩余, 可以暂时共享给那些需要资源的队列, 而一旦该队列有新的应用程序提交, 则其他队列释放的资源会归还给该队列, 这种资源灵活分配的方式明显可以提高资源的利用率;
- 多租户: 支持多用户共享集群和多应用程序同时运行, 为防止单个应用或者用户或队列独占集群资源, 可为之增加限制, 如设置一个用户或者应用程序可以分配的最大资源数、最大任务运行数;
- 安全保证: 每个队列有严格的ACLs列表规定它的访问用户, 每个用户可以指定其他哪些用户允许查看自己应用程序的运行状态或者控制应用程序(i.e. kill);
- 动态更新配置文件: 管理员可以根据需要动态更改各种配置参数, 以实现在线集群管理。
FairScheduler(公平调度)
-
FairScheduler的设计目标: 为所有的应用分配公平的资源 (对公平的定义可以通过参数来设置)。
-
FairScheduler特点:
-
支持资源抢占
-
允许调度器杀死占用超过其应占份额资源队列的containers, 这些containers资源便可被分配到应该享有这些资源份额的队列中。
-
当队列没有任务时, 最小资源可以被其他队列抢走。
-
当有新的任务进来时, 如果集群有资源则获取资源, 如果没有则会从其他优先级较低的队列中抢占资源来执行任务。
-
抢占会降低集群的执行效率, 因此被终止的containers需要被重新执行。
## 实现抢占功能的全局参数 yarn.scheduler.fair.preemption=true ## 最小资源分配抢占超时时间 minimum share preemption timeout ## 公平资源分配抢占超时时间 fair share preemption timeout
如果队列的minimum share preemption timeout指定的时间内未获得最小的资源保障, 调度器就会抢占containers
-
-
灵活的调度策略配置
- 允许为每个队列单独设置调度策略 (FIFO、Fair 或 DRF[dominant resource fairness])
-
提高小应用程序响应时间
- 采用最大最小公平算法, 小作业可以快速获取资源并运行完成。
-
三种调度策略对比
-
FIFOScheduler分配资源的顺序和提交应用程序的顺序相同, 不适用于共享集群。大的应用可能会占用所有集群资源, 这就导致其他应用被阻塞。
-
CapacityScheduler中, 有一个专门的队列来运行小任务, 但这会预先占用一定的集群资源, 因此会导致大任务的执行时间会落后于FIFO调度器运行其的时间。
-
FairScheduler中, 我们不需要预先占用一定的系统资源, Fair调度器会为所有运行的job动态的调整系统资源。