《Hadoop权威指南:大数据的存储与分析》—4.3.3 公平调度器配置

举报
清华大学出版社 发表于 2019/10/12 17:28:23 2019/10/12
【摘要】 本节书摘来自清华大学出版社《Hadoop权威指南:大数据的存储与分析》一书中第四章,第4.3.3节,作者是Tom White , 王 海 华 东 刘 喻 吕粤海 译。

4.3.3  公平调度器配置

公平调度器旨在为所有运行的应用公平分配资源。图4-3展示了同一个队列中的应用是如何实现资源公平共享的。然而公平共享实际也可以在多个队列间工作,后续会对此进行分析。

术语queuepool在公平调度器的上下文中会交替使用。

 

 

 

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

image.png

4-4. 用户队列间的公平共享

1. 启用公平调度器

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

2. 队列配置

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

通过分配文件可以为每个队列进行配置。这样可以对容量调度器支持的层次队列进行配置。例如,可以像为容量调度器所做的那样,使用范例4-2所示的分配文件定义proddev

范例4-2. 公平调度器的分配文件

<?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队列又划分成engscience两个队列。

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

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

 

 

每个队列可以有不同的调度策略。队列的默认调度策略可以通过顶层元素defaultQueueSchedulingPolicy进行设置,如果省略,默认使用公平调度。尽管名称是“公平”,公平调度器也支持队列级别的FIFO(fifo)策略,以及Dominant Resource Fairness(drf)策略,本章稍后会对此策略进行解释。

队列的调度策略可以被该队列的schedulingPolicy 元素指定的策略覆盖。在上述例子中,由于我们希望每个生产性作业能够顺序运行且在最短可能的时间内结束,所以prod队列使用了FIFO调度策略。值得注意的是,在proddev队列之间、engscience队列之间及内部划分资源仍然使用了公平调度。

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

3. 队列放置

公平调度器使用一个基于规则的系统来确定应用应该放到哪个队列。在范例4-2中,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,用户便不能随意创建队列了。

4. 抢占

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

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

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

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

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


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。