公平调度器配置

编程入门 行业动态 更新时间:2024-10-07 05:27:28

<a href=https://www.elefans.com/category/jswz/34/1754813.html style=公平调度器配置"/>

公平调度器配置

概念

公平调度器主要为所有运行的应用公平分配资源。

设想一个场景:假设有 A和B两个用户,分别拥有自己的队列。

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

启用公平调度器

公平调度器的使用属性为yarn.resourcemanager.scheduler.class。默认是使用容量调度器。但在Hadoop分布式项目中,CDH默认使用的是公平调度器。
如果要使用公平调度器,需要将yarn-site.xml文件中的yarn.resourcemanager.scheduler.class设置为公平调度器的完全限定名:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

队列配置

通过一个名为fair-scheduler.xml的分配文件对公平调度器进行配置,该文件位于类路径下。可以通过yarn.scheduler.fair.allocation.file来修改文件名。当没有该分配文件时,公平调度器的工作策略同先前描述的一样,每个应用放置在一个以用户名命名的队列中,队列是在用户提交第一个应用时动态创建的。

通过分配文件可以为每个队列进行配置,这样可以对容量调度器支持的层次队列进行配置。

root--prod--dev--eng--science

假设还是这个队列结构,配置文件示例:

<?xml version="1.0"?>
<allocations><defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy><queue name="prod"><weight>40</weight><schedulingPolicy>fifo</schedulingPolicy></queue><queue name="dev"><weight>60</weight><queue name="eng"/><queue name="science"/></queue><queuePlacementPolicy><rule name="specified" create="false"/><rule name="primaryGroup" create="false"/><rule name="default" queue="dev.eng"/></queuePlacementPolicy>
</allocations>

队列的层次使用嵌套queue元素来定义。所有的队列都是root队列的孩子,即使实际上并没有把root queue嵌套进来。这里的dev队列划分成eng和science两个队列。

队列中有权重元素,用于公平共享计算。在上面的配置文件中,当集群资源按照40:60的比例分配给prod和dev时,集群分配被认为是公平的。eng和science队列没有指定权重,因此它们会被平均分配。权重并不是百分百,例子中时为了简单起见使用了相加之和为100的两个数字。也可以为prod和dev队列分别指定2和3的权重,在效果上是一样的。

当设置权重时,记住要考虑默认队列和动态创建的队列(例如以用户名命名的队列)。虽然没有在分配文件中为它们指定权重,但它们仍有值为1的权重。

每个队列可以有不同的调度策略。队列的默认调度策略可以通过顶层元素defaultQueueSchdulingPolicy进行设置,如果省略,表示使用公平调度。尽管名称是“公平”,公平调度器也支持队列级别的FIFO调度,以及DRF调度(点击链接进入详解)。DRF全称为Dominant Resource Fairness

队列的调度策略可以被该队列schedulingPolicy元素指定的策略覆盖。在上面的配置文件中,由于我们希望每个作业能够顺序进行并在最短可能的时间内完成,所以prod队列使用了FIFO调度策略。值得注意的是,在prod和dev队列之间、eng和science队列之间及内部划分资源仍然使用了公平调度。

尽管上述的分配文件中没有展示,每个队列仍可配置最大和最小资源数量,及最大可运行的应用的数量。最小资源不是一个硬性的限制,但是调度器常用它对资源分配进行优先排序。如果两个队列的资源都低于它们的公平共享额度,那么远低于最小资源数量的那个队列优先被分配资源。最小资源数量也会用于抢占行为(见下方)。

队列放置

公平调度器使用一个基于规则的系统来确定应用应该放到哪个队列。在上述配置文件中,queuePlacementPolicy元素包含了一个规则列表,每条规则会被依次尝试直到匹配成功。第一条规则,specified表示把应用放进所指明的队列中,如果没有指明,或如果所指的队列不存在,则规则不匹配,继续尝试下一条规则。primaryGroup规则会试着把应用放在以用户的主Unix组名命名的队列中,如果没有这样的队列,则继续尝试下一条规则而不是创建队列。Default规则是一条兜底规则,当前规则都不匹配时,将启用该条规则,把应用放进dev.eng队列中。

当然可以完全省略queuePlacementPolicy元素,此时队列放置默认遵从如下规则:

<queuePlacementPolicy><rule name="specified" /><rule name="user" />
</queuePlacementPolicy>

除非明确定义队列,否则必要时会以用户名为队列名创建队列。

另一个简单的队列放置策略是,将所有的应用放进同一个队列中(default)。这样可以在应用之间公平共享资源,而不是在用户之间共享。策略定义等价于以下规则:

<queuePlacementPolicy><rule name="default" />
</queuePlacementPolicy>

不使用分配文件也可以设置以上策略,通过将属性yarn.scheduler.fair.user-as-default-queue设为false,应用就会被放入default队列,而不是各个用户的队列。另外,将属性yarn.scheduler.fair.allow-undeclared-pools设置为false,用户边不能随意创建队列了。

抢占

在一个繁忙的集群中,当作业被提交给一个空队列时,作业不会立即启动,直到集群上已经运行的作业被释放了资源。为了使作业从提交到执行所需的时间可测,公平调度器支持“抢占”功能。

所谓抢占,就是允许调度器中止那些占用资源超过了其公平共享份额的队列的容器,这些容器资源释放后可以分配给资源数量低于应得份额的队列。注意,抢占会降低整个集群的效率,因为被中止的容器需要重新执行。

通过将yarn.scheduler.fair.preemption设置为true,可以全面启用抢占功能。有两个相关的抢占超时设置:一个用于最小共享,另一个用于公平共享,两者设定时间均为秒级。默认情况下,两个超时参数均不设置。所以为了允许抢占容器,需要至少设置其中一个参数。

如果队列在“最小共享”设置指定的时间未获得被承诺的最小共享资源,调度器就会抢占其他容器。可以通过配置文件中的顶层元素defaultMinSharePreemptionTimeout为所有队列设置的默认超时时间,还可以通过设置每个队列的minSharePreemptionTimeout元素来为单个队列指定超时时间。

类似,如果队列在“公平共享”设置指定的时间内未获得的资源仍然小于其公平共享份额的一半,那么调度器就会抢占其它容器。可以通过配置文件中的顶层元素defaultFairSharePreemptionTimeout为所有队列设置默认的超时时间,还可以通过设置每个队列的fairSharePreemptionTimeout元素来为单个队列指定超时时间。通过设置defaultFairSharePreemptionThreshold和fairShrePreemptionThreshold(针对每个队列)可以修改超时阈值,默认值为0.5

 

资源扩展,点击下方链接:

延时调度的配置

更多推荐

公平调度器配置

本文发布于:2024-02-25 07:57:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1698298.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:公平

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!