[关闭]
@changedi 2018-02-05T22:12:57.000000Z 字数 8624 阅读 4306

YARN-Fair Scheduler

大数据 YARN



原文:http://hadoop.apache.org/docs/r2.6.4/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

介绍

公平调度是一种对于全局资源,对于所有应用作业来说,都均匀分配的资源分配方法。YARN有能力调度多种资源类型。默认情况,公平调度器FairScheduler基于内存来安排公平调度策略。也可以配置为同时基于内存和CPU来进行调度,这样情况下需要使用由Ghodsi开发的Dominant Resource Fairness进行。当只有一个单一应用作业运行时,这个应用可以独占整个集群。当其他应用作业提交到集群时,空出来的资源将分配给新的应用,最终所有的应用作业会平分集群资源。不像Hadoop的默认调度器,它只将任务构造一个应用队列,公平调度器会在不饿死长周期作业的同时,优先让短周期作业先运行完成。在一组用户中共享集群也是合理的。最终,公平调度策略可以和应用优先级结合起来工作,优先级是一组权重值,资源会按照这个权重比例来分配给每个应用。

调度器将所有的应用作业组织为队列,在这些队列之间公平的共享资源。默认情况下,所有用户共享一个单一的队列,叫做"default"。 如果一个应用在一个容器资源请求中列出了一个队列名,那么这个请求会被提交到这个队列。同样通过配置基于用户名来分配队列也是合理的。在每个队列内,一个调度策略是在所有运行中的应用之间共享资源。默认的是基于内存的公平调度,当然FIFO和使用Dominant Resource Fairness的多资源调度也是可以配置支持的。队列可以是一个层级排布的分布情况,这样可以划分资源并配置权重来按照特定比例来共享集群。

为了提供公平分享策略,FairScheduler允许保障性的分配最小资源到队列,这对于保证特定用户、组或者生产应用作业能获取到足够资源非常有帮助。当一个队列包含应用作业时,这个队列就有一份最小共享资源。但是当这个队列不再需要完整的保障性的资源时,多余的部分资源会被分配给其他运行中的应用中。这样做保障了队列的容量(虽然它们已不再包含运行中的作业)同时又高效的利用了集群资源。

FairScheduler允许所有的应用按照默认配置运行,同时也支持通过配置文件来限制每个用户每个队列的运行作业数。这对于一个用户必须一次提交成百上千的应用作业是有帮助的,换句话说,当一次需要提交很多作业时这个非常有效,因为这种情况下会造成创建很多的中间数据结果以及很多的上下文切换。限制运行的应用作业数,不会导致任何的已提交作业失败,只会让这些作业在调度器队列中等待直到某些用户的更早的作业结束。

使用可插拔策略的层级队列

公平调度器支持层级队列。所有的队列都衍生自一个叫做“root”的队列。可用的资源在根队列的子队列中使用典型的公平调度方式来分配。接下来,子队列再将获取到的资源以同样的公平策略分配给它们的子队列。所有的应用作业都只会被调度到叶子队列。队列可以被声明为其他队列的子队列,通过配置公平调度分配文件,将其配置到对应的父队列的调度配置文件中。

一个队列的名字以其父队列开始,逐个用英文句号分隔。所以一个队列父队列是root,自己叫queue1,那么它的名字就是root.queue1,同理一个队列叫queue2,其父队列是parent1,那么就叫做root.parent1.queue2。当被别的队列引用时,root部分是可选的,所以刚才的例子也可以简写为queue1和parent1.queue2。

公平调度器也支持为每个队列设置不同的自定义的策略来按照用户的意愿来分配队列资源。自定义策略通过扩展org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy来实现。FifoPolicy, FairSharePolicy (默认的)和DominantResourceFairnessPolicy是几个内建的可供选用的策略。

在MR1版本Hadoop调度中是不支持特定的add-on的。

自动分配应用作业到队列

FairScheduler允许管理员来配置策略从而自动将提交的应用作业分配到合适的队列。这种分配可以依赖提交者的用户和组以及应用请求提交到的目标队列。一个策略一般包含一组规则,对于一个即将到来的应用作业,这组规则顺序的生效来进行分类。每条规则要么分配一个作业到队列,要么拒绝它,或者继续运行下一条规则。根据分配文件格式的不同来配置这些策略。

安装

在yarn-site.xml文件中设置属性来配置使用FairScheduler:

  1. <property>
  2. <name>yarn.resourcemanager.scheduler.class</name>
  3. <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
  4. </property>

配置

配置FairScheduler一般需要配置两个文件。首先调度器相关的选项可以在yarn-site.xml文件中配置。其次,大多数情况下用户希望创建一个分配文件来列出哪些队列用来分配以及对应的权重和容量。这个分配文件会每10秒钟重新加载一次,从而支持运行时配置变更。

yarn-site.xml中的配置属性

分配文件格式Allocation file format

分配文件必须是XML格式。格式包含5个元素类型:

一个例子:

  1. <?xml version="1.0"?>
  2. <allocations>
  3. <queue name="sample_queue">
  4. <minResources>10000 mb,0vcores</minResources>
  5. <maxResources>90000 mb,0vcores</maxResources>
  6. <maxRunningApps>50</maxRunningApps>
  7. <maxAMShare>0.1</maxAMShare>
  8. <weight>2.0</weight>
  9. <schedulingPolicy>fair</schedulingPolicy>
  10. <queue name="sample_sub_queue">
  11. <aclSubmitApps>charlie</aclSubmitApps>
  12. <minResources>5000 mb,0vcores</minResources>
  13. </queue>
  14. </queue>
  15. <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
  16. <!—- Queue 'secondary_group_queueue' is a parent queue and may have
  17. user queues under it -->
  18. <queue name="secondary_group_queue" type="parent">
  19. <weight>3.0</weight>
  20. </queue>
  21. <user name="sample_user">
  22. <maxRunningApps>30</maxRunningApps>
  23. </user>
  24. <userMaxAppsDefault>5</userMaxAppsDefault>
  25. <queuePlacementPolicy>
  26. <rule name="specified" />
  27. <rule name="primaryGroup" create="false" />
  28. <rule name="nestedUserQueue">
  29. <rule name="secondaryGroupExistingQueue" create="false" />
  30. </rule>
  31. <rule name="default" queue="sample_queue"/>
  32. </queuePlacementPolicy>
  33. </allocations>

注意原始的FairScheduler的向后兼容性,"queue"元素可以被"pool"元素来替代。

队列ACL (ACLs)

队列的ACL允许管理员来控制哪些人可以操控队列。ACL是通过配置aclSubmitApps和aclAdministerApps属性来实现的,这些属性都可以被设置到每个队列去。当前唯一支持的管理操作就是杀死应用作业。任何可以管理队列用户也可以提交作业到队列。ACL属性以"user1,user2 group1,group2"或者 " group1,group2"的形式存在。当队列操作的用户或组在该队列的ACL,或者在该队列祖先队列的ACL中,那么该操作可以执行。因此如果queue2在queue1下面,而user1在queue1的ACL中,user2在queue2的ACL中,那么两个用户都可以提交作业到queue2。

注意:ACL中的分隔符是空格。声明只有组的ACL,起始字符需要是一个空格。

root队列的ACL默认是"*",以为ACL是向下传递的,也就是说任何人都是可以提交和杀死每一个队列的应用作业的。要开启严格的访问控制,需要修改root队列的ACL不是默认的星号。

管理

公平调度器通过以下一系列机制来支持运行时的管理:

运行时修改配置

通过编辑分配文件,运行是可以修改最小资源,限制,权重,抢占超时和队列调度策略等属性。调度器会在文件修改后10-15秒重新加载配置文件。

通过web界面监控

当前的作业,队列和公平资源都可以通过ResourceManager的web界面查看,地址是http://ResourceManager URL/cluster/scheduler。

队列的以下属性可以在web界面看到:

队列之间移动作业

FairScheduler支持移动一个正在运行的作业到其他队列。这对于把重要的作业移动到高优先级队列很有用,反之也一样。可以通过运行"yarn application -movetoqueue appID -queue targetQueueName"命令来移动应用。

当一个应用作业被移动到一个队列,它已有的分配资源会被计入到新的队列的资源分配中去,这样做的目的是保证公平。如果目标队列的maxRunningApps或者maxResources限制与要移动的作业冲突,那么作业移动会失败。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注