本文固定链接:https://www.askmac.cn/archives/hadoop-fair-scheduler.html
原文地址:http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
1.目的
这个文档是描述 FairScheduler,一个Hadoop中可拔插的调度,允许YARN应用程序在大型的集群中公平的共享资源。
2.介绍
公平调度是给应用程序分配资源的方法,这样随着时间的推移,所有的应用程序都会得到一个相同的共享资源。Hadoop NextGen 能够调度多个资源类型。默认情况下,Fair Scheduler基于内存进行公平调度。其也可以被配置调度内存和CPU,使用Ghodsi等人开发的Dominant Resource Fairness概念。当只有一个应用程序运行时,那个应用程序使用整个集群。当其他应用程序被提交,空闲的资源被分配给新的应用程序,这样每个应用程序最终获得大致相同的资源量。不用于默认的Hadoop调度,默认的调度是一个应用程序的队列,这可以让短因此程序在合理的时间内完成,而不是饥饿的长期应用程序。其也是一个合理的方式来在一些用户之间共享集群。最后,公平共享也可以以应用程序优先级工作-优先级被作为权重来确定每个应用程序应该获得的资源分数。
这个调度将应用程序进一步转换为“队列”,并在这些队列之间公平的共享资源。在默认情况下,所有用户共享一个用户,名称是“default”。如果一个应用程序专门列出了在一个容器中的队列的资源请求,这个请求被提交到队列。其也可以通过配置包含需求的用户名来分配队列。在每个队列中,调度策略被用于在运行中的应用程序之间共享资源。默认情况下是急用内存的公平调度,但是在Dominant Resource Fairness中的FIFO和多资源也可以被配置。队列可以被安排在层级结构中分配资源和被配置权重,以共享特定比例的集群。
除了提供公平共享,Fair Scheduler允许分配保证给队列的最小共享,这个对于确保某些用户、组或生产应用程序始终获得足够的资源是有帮助的。当一个队列包含应用程序,它获得至少其最小的共享,但是当队列不需要其保证足够份额时,多余的是可以在其他应用程序直接分裂。这可以让调度程序保证队列的能力,当这些队列不包含应用程序时,能有效的利用资源。(www.askmac.cn)
Fair Scheduler 让所有的应用程序以默认形式运行,但是也以通过配置文件来限制每个用户和每个队列运行的应用程序的数目。这在一个用户在一次提交数百个应用程序时是有帮助的,或者在一般情况下提升性能,例如一次性运行太多的应用程序,会导致太多的中间数据被创建或太多的上下文切换。限制应用程序不会导致任何随后提交的应用程序失败,只会等待在调度中的队列,直到一些用户的更早的应用程序完成。
3.可拔插策略中的层级化队列
公平调度支持层级化队列。所有队列起源于一个被称为“root”的队列,可利用的资源被分布式的,以典型的公平调度的方式存放在root队列的子队列中。然后,这些孩子把分配给他们的资源以同样的方式分配给他们的孩子。应用程序可能只在子队列上被调度。通过将它们作为它们的父母的子元素放置在公平调度分配文件中,队列可以被指定作为其他队列的子元素。
一个队列的名称从它的父母开始,以分隔符为周期。所以,一个在root队列下队列名称为”queue1”的队列,将被关联作为”root.queue1”,并且在队列parent1之下的队列”queue2”将被关联作为“root.parent1.queue2”,当关联到队列时,root部分的名称时可选的,也就是queue1可以被仅仅关联为”queue1”,queue2可以被关联简称“parent1.queue2”
(www.askmac.cn)
除此之外,公平调度允许对每个队列设置不同的客户策略以任何用户想的范式,来允许共享队列的资源。一个客户策略可以通过延伸org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy被构建。FifoPolicy, FairSharePolicy (默认情况),并且DominantResourceFairnessPolicy是内置的,可以很容易地被使用。
某些查询不支持原来(MR1)存在的Fair Scheduler.其中,是使用一个自定义策略,控制某些应用程序的“boosting”优先级。
4.自动地将应用程序放置到队列中
Fair Scheduler允许管理员配置策略,自动将提交的应用程序放置到适当的队列中。位置取决于提交的用户和组和通过应用程序传递的被请求的队列。一个策略包含一组规则,将传入的应用程序按顺序分类。每个规则都可以将应用程序放在一个队列中,拒绝它,或者继续下一个规则。下面的配置文件是如何配置这些策略的。
(www.askmac.cn)
5.安装
为了使用Fair Scheduler 首先在yarn-site.xml分配合适的调度类:
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property>
6.配置
自定义的Fair Scheduler 通常调用修改2个文件。首先,在你现有的配置目录中的yarn-site.xml文件中增加配置属性可以设置调度-广泛的选项。第二,在大多数情况下,用户将创建一个分配文件列表,包含存在的队列和它们各自的权重和容量。配置文件每10秒加载一次,允许在运行的时候被修改。(www.askmac.cn)
6.1 在yarn-site.xml可以被配置的属性
属性 | 描述 |
yarn.scheduler.fair.allocation.file | 分配文件的路径。一个分配文件是一个XML清单,描述队列和它们的属性,除了某些策略默认值之外。这个文件必须是XML格式。如果是一个相对路径,文件在类路径中(通常是Hadoop配置路径)。默认是fair-scheduler.xml |
yarn.scheduler.fair.user-as-default-queue | 是否使用用户名关联分配作为默认的队列名,在未指定队列名称的情况下。如果这个被设置为false或者未设置,所有的作业都有一个共享的默认队列,被称为”default”。默认是true。如果在分配文件中给出了队列的放置策略,则忽略此属性。 |
yarn.scheduler.fair.preemption | 是否使用优先级,默认是false |
yarn.scheduler.fair.preemption.cluster-utilization-threshold | 在优先级被踢后,利用率的阈值。利用率极端的最大比例是使用所有资源的能力。默认是0.8f。 |
yarn.scheduler.fair.sizebasedweight | 基于它们的大小,分配共享到单个应用程序,而不是不论大小提供一个平等共享给所有的应用程序。当设置为true时,应用程序被由自然对数加上应用程序的总请求的内存,除以自然对数2加权。默认是false。 |
yarn.scheduler.fair.assignmultiple | 是否允许在一个心跳中分配多个容器。默认为false。 |
yarn.scheduler.fair.max.assign | 如果.assignmultiple属性设置为true,那么此参数允许设置在一个心跳中分配的最大容器数目。默认是-1,也就是无限制 |
yarn.scheduler.fair.locality.threshold.node | 对于特定节点上请求容器的应用程序,最后一个分配的容器等待之前允许放置到其他节点的调度机会数。表示在介于0和1之间浮动。其中,作为集群大小的一部分,是通过了的调度机会数,默认是-1,也就是不放弃任何调度机会。 |
yarn.scheduler.fair.locality.threshold.rack | 对于特定机架上的请求容器的应用程序,最后一个分配的容器等待之前允许放置到其他机架的调度机会数。其中,作为集群大小的一部分,是通过了的调度机会数,默认是-1,也就是不放弃任何调度机会。 |
yarn.scheduler.fair.allow-undeclared-pools | 如果这是true,新的队列可以在应用程序提交的时候被创建,是因为它们通过提交被作为应用程序的队列被指定,或因为它们通过用户默认队列属性被放置。如果这是false,任何时间的应用程序可以没放置到没有在分配文件中指定的队列中,而不是放置到”default”队列中。如果一个队列放置策略在分配文件中被指定,则忽略此属性。(www.askmac.cn) |
yarn.scheduler.fair.update-interval-ms | 锁住调度和重新计算公平共享,重新计算的需求,和检查是否是由于强占的区间。默认是500毫秒。 |
6.2 分配文件的格式
分配文件必须是XML格式。这个格式包含5类元素:
1.队列元素:
表示队列。队列元素可以选择一个可选属性“type”,当设置为‘parent’可以将其设置为父队列。这个当我们想创建一个父队列而不配置任何子队列时是有用的。每个队列元素可能包含下列属性:
-minResources:队列最小资源所有权,是以”X mb,Y vcores”形式。对于单一资源公平策略,vcores值被忽略。如果一个队列的最小共享不满足,则将在同一个父之前的任何其他队列中提供可用的资源。在单一资源公平策略下,如果一个队列的内存使用率低于其最小内存共享,则被认为是不满足的。在主导资源公平下,一个队列如果它的使用占主导地位的资源相对于集群容量是低于其最低份额的,那么其没认为是不满意的。如果在这个情况下,多个队列是不满足的,资源到队列是相关资源实例用和最小值中间最小的比例。注意这是可能的,一个队列低于其最小值,可能不会立即获得其最小值当其提交一个应用程序时,因为已经运行的作业可能会使用到这些资源。(www.askmac.cn)
– maxResources:队列被允许的最大资源,以”X mb,Y vcores”的形式。对于单一资源的公平策略,Vcores值被忽略。如果其总使用量超过这个限制,一个队列将永远不会被分配到一个容器。
– maxRunningApps:限制同时从队列中运行的应用程序数目。
– maxAMShare:限制可用于运行应用程序主程序的队列的公平份额的分数。此属性只能用于子队列。例如,如果设置为1.0f,然后AMs在子队列可以达到100%的内存和CPU的公平分享。对-1.0f价值将禁用此功能,amShare不会被检查。默认值是0.5f
-weight:非比例的于其他队列共享集群,权重默认值是1,并且一个权重是2的队列应得到作为一个队列权重越2倍多的资源。
– schedulingPolicy:为任何队列设置调度策略。这个允许的值是”fifo”/”fair”/”drf”或任何org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy.延伸类。默认是”fair”。如果是”fifo”,在此之前提交的应用程序被优先给与容器,但是应用程序提交之后可能同时运行,如果这里在满足早期应用程序后,集群上有剩余的空间。
– aclSubmitApps:可以向队列中提交应用程序的用户和/或组的列表。
– aclAdministerApps:可以管理队列的用户和/或组的列表。目前唯一的能管理的动作是杀死一个应用程序。
– minSharePreemptionTimeout:从其他队列试图强占容器资源之前,在最小共享下的秒数。如果没设置,队列将继承其父队列的值。
– fairSharePreemptionTimeout:从其他队列试图强占容器资源之前,在公平共享阈值下的秒数。如果没设置,队列将继承其父队列的值。
– fairSharePreemptionThreshold:队列的公平共享优先权阈值。如果队列等待fairSharePreemptionTimeout没有接受到fairSharePreemptionThreshold* fairShare相应的资源,其可以从其他队列强占容器资源。如果没设置,队列将继承其父队列的值。
2.用户元素:
它代表了管理个人用户行为的设置。它们可以包含一个单一的属性:maxrunningapps,对于特定用户运行应用程序的一个限制。(www.askmac.cn)
3.一个userMaxAppsDefault元素:
对于未指定其他指定的任何用户,设置默认运行应用程序限制。
- defaultFairSharePreemption Timeout 元素:
对root队列设置公平共享强占超时时间,被root队列中的fairSharePreemptionTimeout 元素重写
- defaultMinSharePreemptionTimeout 元素:对root队列设置最小共享强占超时时间,被root队列中的defaultMinSharePreemptionTimeout元素重写
- defaultFairSharePreemptionThreshold 元素:对root队列设置最小共享强占阈值,被root队列中的defaultFairSharePreemptionThreshold元素重写。
7.queueMaxAppsDefault 元素:为队列设置默认运行应用程序限制;被每个队列中的maxRunningApps元素重写。
- queueMaxAMShareDefault 元素:为队列设置默认AM资源;被每个队列的maxAMShare 元素重写。
- defaultQueueSchedulingPolicy 元素:为队列设置默认的调度策略;如果被指定的话,被每个队列中的schedulingPolicy元素重写。默认是fair
- queuePlacementPolicy元素:
其中包含一个规则元素列表,告诉调度如何放置传入的应用程序到队列。规则按照它们被列出的顺序被应用。规则可以获取参数。所有的规则接受”create”参数,这表示规则是够能创建一个新队列。“create”默认是true,如果设置为false并且该规则应该放置应用程序到队列,但是没有在分配文件中配置,我们会继续到下一个规则。最后一个规则必须是一个可能永远不发出继续的规则。有效的规则是:(www.askmac.cn)
-specified:该应用程序配放置到其去修的队列。如果应用程序需求无队列,例如,其指定”default”,我们继续。如果应用程序被需求一个队列名开始或结束是“”.“”,例如,命名例如”.q1”或“q1.“,将被拒绝。
-user:应用程序被放置到名称为提交的用户的队列中。用户名的“.”将被”_dot_”替换,例如对于用户“first.last”的用户是”first_dot_last”
– primaryGroup:应用程序被放置到一个名称为提交用户的主组的队列中,组名中的”.”被替换为”_dot_”,例如组名为”one.two”是“one_dot_two”
– secondaryGroupExistingQueue: 应用程序被放置到一个名称为提交用户的匹配第二组名的队列中。第一个被匹配的第二组名将被选中。组名中的”.”将被替换为”_dot_”,例如一个用户的第二组名为”one.two”将被置换为“one_dot_two”,如果这个队列存在的话。
– nestedUserQueue:嵌套规则。(忽略)
-default:该应用程序被放置在默认规则的属性queue’指定的队列中。如果’queue’为设置,那么应用程序被放置到’root.default’队列。
-reject:应用程序被拒绝
一个分配文件的例子:
<?xml version="1.0"?> <allocations> <queue name="sample_queue"> <minResources>10000 mb,0vcores</minResources> <maxResources>90000 mb,0vcores</maxResources> <maxRunningApps>50</maxRunningApps> <maxAMShare>0.1</maxAMShare> <weight>2.0</weight> <schedulingPolicy>fair</schedulingPolicy> <queue name="sample_sub_queue"> <aclSubmitApps>charlie</aclSubmitApps> <minResources>5000 mb,0vcores</minResources> </queue> </queue> <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault> <!-- Queue 'secondary_group_queue' is a parent queue and may have user queues under it --> <queue name="secondary_group_queue" type="parent"> <weight>3.0</weight> </queue> <user name="sample_user"> <maxRunningApps>30</maxRunningApps> </user> <userMaxAppsDefault>5</userMaxAppsDefault> <queuePlacementPolicy> <rule name="specified" /> <rule name="primaryGroup" create="false" /> <rule name="nestedUserQueue"> <rule name="secondaryGroupExistingQueue" create="false" /> </rule> <rule name="default" queue="sample_queue"/> </queuePlacementPolicy> </allocations>
注意,为了向后兼容性,queue元素可以被pool元素代替。
6.3 队列访问控制列表
队列的访问控制列表(ACLS)允许管理员来控制在特定队列上,谁可以执行动作。它们都配置了aclSubmitApps和aclAdministerApps属性,可以对每个队列进行设置。目前只支持管理的行动是kill 应用进程。任何人管理队列的人也可以提交一个队列。这个属性的格式例如“user1,user2 group1,group2”或“group1,group2”。一个在队列上的动作将被提交,如果其用户或组在队列的ACL中或者任何父队列的ACL中。所以如果队列2在队列1中,并且user1在队列1的ACL中,user2在队列2的ACL中,那么这2个用户都可以提交队列2。(www.askmac.cn)
注意:分隔符是空格符。指定唯一的ACL组,使用空格符开始。
在默认情况下,Root队列的ACL是”*”,因为ACL是传递的,意味着每个人可以从每个队列中提交和杀死应用进程。开始限制访问,变更root队列的ACL为其他的而不是”*”
7管理
公平调度程序在运行时通过一些机制提供给管理的支持:
7.1 在运行时修改配置
其可以通过编辑分配文件,来修改最小共享,限制,权限,强制超时时间和队列调度策略和在允许时间。调度将在看到其被修改后10-15秒后重新加载(www.askmac.cn)
7.2 通过Web UI 监控
当前应用程序,队列,和公平共享可以通过资源管理器的web接口来检查,在http://*ResourceManager URL*/cluster/scheduler。
在web界面上的每个队列都可以看到下列字段:
1.userd Resources – 队列中分配给容器的资源总和。
- Num Active Applications – 已接收至少一个容器的队列中的应用程序的数量。
- Num Pending Applications –尚未接收任何容器的队列中的应用程序的数量。
- Min Resources – 保证队列最小资源的配置。
- Max Resources – 已被允许的队列的配置的最大资源。
- Instantaneous Fair Share –队列的瞬时公平共享资源。这些共享只考虑活动的队列(那些运行的应用程序),和用于的调度策略。当其他队列没有使用它们时,队列可能在它们的共享之外分配资源。一个队列的资源消耗出来或低于其公平份额,而不会有瞬时容器争抢。
- Steady Fair Share – 队列资源的稳定的公共共享。这些共享考虑所有的队列,不论它们是否是积极的(有运行应用程序)。当配置和容量变化时,这些都被计算较少的变更。它们的意思是提供可视性,在用户期望的资源上,并因此显示在WEB 界面上。
7.3 在队列之间移动应用进程
Fair Scheduler 支持 移动一个正在运行的应用程序到一个不同的队列。这个对于将一个重要的应用程序移动到一个优先级更高的队列,或将不重要的应用程序移动到优先级更低的队列是有帮助的。应用程序移动可以通过运行 yarn application -movetoqueue appID -queue targetQueueName进行。
当一个应用程序被移动到一个队列,其享有的分配称为计数于新的队列的分破,而不是旧的确定公平性的目的。如果增加的应用程序资源到队列将违反maxRunningApps 或maxResources,一个试图移动一个应用程序到一个队列将失败。
Leave a Reply