0%

YARN Fair scheduler

YARN 默认调度 Fair scheduler


前言

工作中这个问题碰到好几次了。调度规则(scheduling rule),啥是调度策略(scheduling policy),还有 CDH 本身有个动态资源池的概念,
让我学了又忘,忘了又学,这次通过文档方式来给自己一个交代。

资源

什么是资源?

对于一个资源管理系统,首先要确定什么是资源,然后将每种资源量化,最后对量化的资源进行管理。

YARN对资源的抽象很简单,只有内存和vcore,这两种资源。每个NodeManager节点贡献一定的内存和vcore,由ResourceManager统一管理。

调度规则

YARN的三种调度规则(scheduling rule)

  • FIFO Scheduler
  • Capacity Scheduler
  • Fair Scheduler

调度规则具体可以看YARN中FIFO、Capacity以及Fari调度器的详细介绍
,记得之前有次看到说随着发展,Capacity 与 Fari 区别越来越小了

调度策略

Fair Scheduler支持的调度策略

Additionally, the fair scheduler allows setting a different custom policy for each queue to allow sharing the queue’s resources in any which way the user wants. A custom policy can be built by extending org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy. FifoPolicy, FairSharePolicy (default), and DominantResourceFairnessPolicy are built-in and can be readily used.

队列内部的默认调度策略是基于内存的共享策略,也可以配置成 FIFO 和 multi-resource with Dominant Resource Fairness (即DRF)

对于CDH版本来说有些不同,CDH版本的 Fair Scheduler 默认是采用DRF 策略

Dominant Resource Fairness (DRF) (default) - An extension of fair scheduling for more than one resource. DRF determines CPU and memory resource shares based on the availability of those resources and the job requirements.

也就是说 CDH 版本的 YARN 默认采用的调度策略是 Fair Scheduler 的 DRF 策略,即基于 vcore 和内存的策略,而不是只基于内存的调度策略。

Fair Scheduler

FairScheduler 默认让所有的 apps 都运行,但是也可以通过配置文件限制每个用户以及每个queue运行的apps的数量。
这是针对一个用户一次提交hundreds of apps产生大量中间结果数据或者大量的context-switching的情况。

大的任务job1提交并执行,占用了集群的全部资源,开始执行。之后小的job2执行时,获得系统一半的资源,开始执行。因此每个job可以公平地使用系统的资源。当job2执行完毕,并且集群中没有其他的job加入时,job1又可以获得全部的资源继续执行。

两个用户A和B。A提交job1时集群内没有正在运行的app,因此job1独占集群中的资源。用户B的job2提交时,job2在job1释放一半的containers之后,开始执行。job2还没执行完的时候,用户B提交了job3,job2释放它占用的一半containers之后,job3获得资源开始执行。

抢占

Capacity Scheduler 与 Fair Scheduler 都可以将集群分为队列且允许抢占机制

当一个job提交到一个繁忙集群中的空队列时,job并不会马上执行,而是阻塞直到正在运行的job释放系统资源。为了使提交job的执行时间更具预测性(可以设置等待的超时时间),调度器支持抢占。

抢占就是允许调度器杀掉占用超过其应占份额资源队列的containers,这些containers资源便可被分配到应该享有这些份额资源的队列中。需要注意抢占会降低集群的执行效率,因为被终止的containers需要被重新执行。

可以阅读下方三个参考链接


参考链接