三种调度器

image.png

FIFO Scheduler — FIFO调度器

十八、yarn的三种调度器 - 图2

  • hadoop1.x默认使用FIFO作为调度器,遵循先进先出原则

    Capacity Scheduler — 容量调度器

    十八、yarn的三种调度器 - 图3

  • 支持多个队列,某个作业可能被分配提交到一个队列中,每个队列会配置一定比例的计算资源,且所有提交到队列中的作业共享该队列中的资源

  • 空闲资源会被分配给那些未达到资源使用上限的队列。
  • 多重租赁,综合考虑多种约束防止单个做个,单个用户会队列独占集群中所有的资源
  • 基于资源调度,支持资源密集型作业,允许作业使用的资源量高于默认值,进而可容纳不同资源需求的作业,不过当前只支持内存资源调度
  • hadoop2.x默认使用的是容量调度器

使用:配置yarn-site.xml文件中设置yarn.resourcemanager.scheduler.class属性为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.CapacityScheduler

Fair Scheduler — 公平调度器

定义 - 解释

想象两个用户A和B,分别拥有自己的队列。A启动一个作业,在B没有需求时A会分配到全部可用资源;当A的作业仍在运行时B启动一个作业,一段时间后,按照我们先前看到的方式,每个作业都用到了一半的集群资源。这时,如果B启动第二个做作业且其他作业仍在运行,那么第二个作业将和B的其他作业(这里是第一个)共享资源,因此B的每个作业将占四分之一的集群资源,而A仍继续占用一半的集群资源。最终的结果就是资源在用户之间实现了公平共享。

Fair scheduler配置示例

  1. <!– scheduler start –>
  2. <property>
  3. <!-- 配置Yarn使用的调度器插件类名 -->
  4. <name>yarn.resourcemanager.scheduler.class</name>
  5. <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
  6. </property>
  7. <property>
  8. <!-- 配置资源池以及其属性配额的XML文档路径 -->
  9. <name>yarn.scheduler.fair.allocation.file</name>
  10. <value>/etc/hadoop/conf/fair-scheduler.xml</value>
  11. </property>
  12. <property>
  13. <!-- 开启资源抢占 -->
  14. <name>yarn.scheduler.fair.preemption</name>
  15. <value>true</value>
  16. </property>
  17. <property>
  18. <!-- 设置成true,当任务中未指定资源池的时候,将以用户名作为资源池名。这个配置就实现了根据用户名自动分配资源池。 -->
  19. <name>yarn.scheduler.fair.user-as-default-queue</name>
  20. <value>true</value>
  21. <description>default is True</description>
  22. </property>
  23. <property>
  24. <!-- 是否允许创建未定义的资源池。 -->
  25. <!-- 如果设置成trueyarn将会自动创建任务中指定的未定义过的资源池。设置成false之后,任务中指定的未定义的资源池将无效,该任务会被分配到default资源池中。-->
  26. <name>yarn.scheduler.fair.allow-undeclared-pools</name>
  27. <value>false</value>
  28. <description>default is True</description>
  29. </property>
  30. <!– scheduler end –>

https://www.dazhuanlan.com/2019/11/30/5de18da12bb44/
https://cloud.tencent.com/developer/article/1239472

Capactiy scheduler与Fair scheduler的区别

  • 公平调度器是以pool(资源池)为单位来分配任务的slots

容量调度器是以queue队列的方式分配taskTracker的

  • 当都只有一个job的时候,两种调度器都可以利用整个集群资源,再pool中可以是以FIFO方式调度也可以FIFO方式调度也可以是公平方式调度,但是在queue中只能以FIFO方式调度
  • 在pool内部是支持抢占的,也就是可以为某个pool(通常是生产上的用户)分配最低的任务solt,当这个pool得不到最低资源时,会kill掉其他的job的task以使自己获得最低的资源,这并不会引起其他job的失败,因为可容错