Fair Schedule
先上官网链接:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
本帖基本来自官方文档~细改了翻译,字有点多,多为文字描述= =慢慢看
另一篇:YARN 三大调度器 之 Capacity Schedule 容器调度器
概述
公平调度是一种为应用程序分配资源的方法,它可以随时间使得所有应用程序平均获得相等的资源份额。 下一代的Hadoop能够调度多种资源类型。默认情况下,公平调度程序仅基于内存来确定调度公平性决策。它可以使用Ghodsi等人开发的DRF(作业调度算法)的概念来配置,同时调度内存和CPU。当有一个应用程序在运行时,该应用程序将使用整个集群。当提交其他应用程序时,将会有资源被释放来分配给新应用程序,以便最终每个应用程序获得的资源大致相同。与组成应用程序队列的默认Hadoop调度器不同,这可以让短应用程序在合理的时间内完成,同时不会使长期存在的应用程序挨饿。它也是一种在多个用户之间共享群集的合理方式。最后,公平共享还可以与应用优先级一起使用 - 优先级用权重来确定每个应用应获得的总资源的比例。
调度程序将应用程序进一步组织为“队列”,并在这些队列之间公平地共享资源。默认情况下,所有用户共享一个名为“default”的队列。如果应用程序专门在容器资源请求中列出队列,则将请求提交给该队列。还可以通过配置中基于请求的用户名来分配队列。在每个队列中,调度策略被用来在正在运行的应用程序之间共享资源。默认是根据内存来公平分享资源,但也可以配置具有DRF(作业调度算法)的FIFO和多资源策略。队列可以按照阶级来划分资源,并根据权重配置来按特定比例去共享群集。
除了提供公平共享资源外,Fair Scheduler还允许为队列分配可保证的最小资源,这对于确保某些用户,用户组或生产应用始终获得足够的资源是很有用的。当队列包含应用程序时,它最少能获得一个最小资源,但是当队列不需要完全保证共享时,超出部分将在其他正在运行的应用程序之间分配。这使得调度器可以保证队列容量,同时在队列里不包含应用程序时,可以有效地利用资源。
Fair Scheduler允许所有应用程序默认运行,但也可以通过配置文件限制每个用户和每个队列运行的应用程序数量。这在当用户必须一次提交数百个应用程序时是非常有用的,或者说,如果同时运行太多应用程序会导致创建过多的中间数据或过多的上下文切换时,可以提高性能。限制应用程序不会导致任何后续提交的应用程序失败,只会在调度程序的队列中等待,直到某些用户的早期的应用程序完成为止。
Hierarchical queues with pluggable policies(具有可插拔策略的分层队列)
Fair Scheduler支持层次队列(hierarchical queues),所有队列都从root队列开始,root队列的孩子队列公平地共享可用的资源。孩子队列再把可用资源公平地分配给他们的孩子队列。apps可能只会在叶子队列被调度。此外,用户可以为每个队列设置不同的共享资源的策略,内置的队列策略包括 FifoPolicy, FairSharePolicy (default), and DominantResourceFairnessPolicy。
用户可以通过继承org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy实现自己定义的策略。
使用
yarn-site.xml
<property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
自定义配置
自定义Fair Scheduler通常涉及更改两个文件。首先,可以通过在现有配置目录的yarn-site.xml文件中添加配置属性来设置调度程序范围的选项。其次,在大多数情况下,用户需要创建一个分配文件,列出存在哪些队列以及它们各自的权重和容量。分配文件每10秒重新加载一次,允许动态更改。
可以放在yarn-site.xml中的属性
属性 | 描述 |
---|---|
yarn.scheduler.fair.allocation.file | 分配文件的路径。除了某些策略默认值之外,分配文件是描述队列及其属性的XML清单。此文件必须采用下一节中描述的XML格式。如果给出了相对路径,则在类路径(通常包括Hadoop conf目录)上搜索文件。默认为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.dynamic.max.assign | 如果assignmultiple为true,则是否动态确定可在一个心跳中分配的资源量。打开时,节点上大约一半未分配的资源将分配给单个心跳中的容器。默认为true。 |
yarn.scheduler.fair.max.assign | 如果assignmultiple为true且dynamic.max.assign为false,则可以在一个心跳中分配的最大容器数量。默认为-1,不设置限制。 |
yarn.scheduler.fair.locality.threshold.node | 对于在特定节点上请求容器的应用程序,自上次容器分配以来在接受另一个节点上的放置之前等待的调度机会的数量。表示为0到1之间的浮点数,它作为簇大小的一部分,是要传递的调度机会的数量。默认值-1.0表示不会调出任何调度机会。 |
yarn.scheduler.fair.locality.threshold.rack | 对于在特定机架上请求容器的应用程序,自上次容器分配以来在接受另一个机架上的放置之前等待的调度机会的数量。表示为0到1之间的浮点数,它作为簇大小的一部分,是要传递的调度机会的数量。默认值-1.0表示不会调出任何调度机会。 |
yarn.scheduler.fair.allow-undeclared-pools | 如果是这样,则可以在应用程序提交时创建新队列,无论是因为提交者将它们指定为应用程序的队列,还是因为user-as-default-queue属性将它们放在那里。如果这是错误的,则只要将应用程序放置在未在分配文件中指定的队列中,就会将其置于“默认”队列中。默认为true。如果在分配文件中给出了队列放置策略,则忽略此属性 |
yarn.scheduler.fair.update-interval-ms | 锁定调度程序并重新计算公平份额的间隔,重新计算需求,并检查是否有任何事项应该抢占。默认为500毫秒。 |
分配文件
分配文件必须是XML格式。格式包含五种类型的元素:
- Queue elements:代表队列。队列元素可以采用可选属性“类型”,当设置为“父”时,它将使其成为父队列。当我们想要创建父队列而不配置任何叶队列时,这非常有用。每个队列元素可能包含以下属性:
- minResources:队列有权获得的最小资源
- maxResources:分配队列的最大资源
- maxChildResources:分配ad hoc子队列的最大资源
- maxRunningApps:限制队列中的应用程序数量一次运行
- maxAMShare:限制可用于运行应用程序主服务器的队列公平共享的分数。
- weight:与其他队列不成比例地共享群集。权重默认为1,权重为2的队列应该获得的资源大约是具有默认权重的队列的两倍。
- schedulingPolicy:设置任意队列的调度策略。
- aclSubmitApps:可以将应用程序提交到队列的用户和/或组的列表。
- aclAdministerApps:可以管理队列的用户和/或组的列表。
- minSharePreemptionTimeout:队列在尝试抢占容器以从其他队列获取资源之前,队列在其最小份额之下的秒数。
- fairSharePreemptionTimeout:队列在尝试抢占容器以从其他队列中获取资源之前,队列处于其公平共享阈值之下的秒数。
- fairSharePreemptionThreshold:队列的公平共享抢占阈值。
- allowPreemptionFrom:确定是否允许调度程序从队列中抢占资源。默认值为true。如果队列将此属性设置为false,则此属性将递归应用于所有子队列。
- reservation:向ReservationSystem表示队列的资源可供用户保留。这仅适用于叶队列。如果未配置此属性,则无法保留叶队列。
- User elements:表示管理各个用户行为的设置。它们可以包含单个属性:maxRunningApps,对特定用户正在运行的应用程序数量的限制。
- A userMaxAppsDefault element: 为未以其他方式指定限制的任何用户设置默认运行应用程序限制。
- A defaultFairSharePreemptionTimeout element: 设置根队列的公平共享抢占超时; 被根队列中的fairSharePreemptionTimeout元素覆盖。默认设置为Long.MAX_VALUE。
- A defaultMinSharePreemptionTimeout element: 设置根队列的最小共享抢占超时; 被根队列中的minSharePreemptionTimeout元素覆盖。默认设置为Long.MAX_VALUE。
- A defaultFairSharePreemptionThreshold element:设置根队列的公平共享抢占阈值; 被根队列中的fairSharePreemptionThreshold元素覆盖。默认设置为0.5f。
- A queueMaxAppsDefault element:设置队列的默认运行应用限制; 被每个队列中的maxRunningApps元素覆盖。
- A queueMaxResourcesDefault element: 设置队列的默认最大资源限制; 被每个队列中的maxResources元素覆盖。
- A queueMaxAMShareDefault element: 设置队列的默认AM资源限制; 被每个队列中的maxAMShare元素覆盖。
- A defaultQueueSchedulingPolicy element: 设置队列的默认调度策略; 如果指定,则由每个队列中的schedulingPolicy元素覆盖。默认为“合理”。
- A reservation-agent element: 设置ReservationAgent实现的类名,它试图将用户的预留请求放入Plan中。默认值为org.apache.hadoop.yarn.server.resourcemanager.reservation.planning.AlignedPlannerWithGreedy。
- A reservation-policy element:设置SharingPolicy实现的类名,验证新保留是否违反任何不变量。默认值为org.apache.hadoop.yarn.server.resourcemanager.reservation.CapacityOverTimePolicy。
- A reservation-planner element:设置Planner实现的类名,如果Plan容量低于(由于计划维护或节点故障)用户保留的资源,则调用该类名称。默认值为org.apache.hadoop.yarn.server.resourcemanager.reservation.planning.SimpleCapacityReplanner,它扫描计划并以相反的接受顺序(LIFO)贪婪地删除预留,直到预留资源在计划容量内。
- A queuePlacementPolicy element:包含一系列规则元素,告诉调度程序如何将传入的应用程序放入队列。规则按列出的顺序应用。规则可能需要参数。所有规则都接受“create”参数,该参数指示规则是否可以创建新队列。“创建”默认为true; 如果设置为false并且规则将应用程序放在未在分配文件中配置的队列中,我们将继续执行下一个规则。最后一条规则必须是永不发出继续的规则。
示例:
<?xml version =“1.0”?>
<allocations> <queue name =“sample_queue”> <minResources> 10000 mb,0vores </ minResources> <maxResources> 90000 mb,0vores </ 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,0vores </ minResources> </ queue> <queue name =“sample_reservable_queue”> <预订> </ reservation> </ queue> </ queue> <queueMaxAMShareDefault> 0.5 </ queueMaxAMShareDefault><queueMaxResourcesDefault> 40000 mb,0vores </ queueMaxResourcesDefault> <! - Queue'secondary_group_queue '是父队列,可能在其下有用户队列 - > <queue name =“secondary_group_queue”type =“parent”> <weight> 3.0 </ weight> <maxChildResources> 4096 mb,4vcores </ maxChildResources> </ 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>
</ allocation>
请注意,为了向后兼容原始的FairScheduler,“queue”元素可以改为命名为“pool”元素。
管理
运行时修改配置
通过编辑分配文件,可以在运行时修改最小份额,限制,权重,抢占超时和队列调度策略。调度程序将在看到它被修改后10-15秒重新加载此文件。
Web UI监控
可以通过ResourceManager的Web界面在http:// * ResourceManager URL * / cluster / scheduler中检查当前的应用程序,队列和公平份额(资源)。
可以在Web界面上的每个队列中看到以下字段:
-
Used Resources - 分配给队列中容器的资源总和。
-
Num Active Applications - 队列中至少收到一个容器的应用程序数。
-
Num Pending Applications - 队列中尚未收到任何容器的应用程序数。
-
Min Resources - 保证队列的最低资源配置。
-
Max Resources - 允许进入队列的最大资源配置。
-
Instantaneous Fair Share - 队列的瞬时公平份额资源。这些资源仅考虑活动队列(具有正在运行的应用程序的队列),并用于调度决策。当其他队列不使用队列时,可以为队列分配超出其共享的资源。资源消耗等于或低于其瞬时公平份额的队列将永远不会抢占其容器。
-
Steady Fair Share - 队列稳定的公平份额资源。这些资源考虑所有队列,无论它们是否处于活动状态(已运行应用程序)。这样,计算就不会很频繁,而且仅在配置或容量发生变化时才会更改。它们旨在提供用户可以预期的资源可见性,从而显示在Web UI中。