简单了解公平调度器的一些队列设置

时间:2022-06-06
本文章向大家介绍简单了解公平调度器的一些队列设置,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

导语

在腾讯云EMR的用户日常反馈中,经常会遇到因为YARN的队列配置不合理导致资源利用率不高,任务提交不上的问题,所以有了以下的文章,方便用户在日常按照一定的需求将队列资源和优先级进行划分

在这篇文章中,我们将会提供一些例子,通过一些参数组合来实现应用分级和资源队列的划分。

场景一:创建一个"best_effort"队列 描述:在公平调度器中,当一个队列的权重(weight)等于0.0的时候,代表这个队列当集群资源存在空闲的时候他才能运行app,换句话说,所有在priority_jobs队列的app会优先的获取分配,剩余的空闲的资源才会分配给best_effort_jobs队列

<queue name="priority_jobs">
</queue>
<queue name="best_effort_jobs">
    <weight>0.0</weight>
</queue>

场景二:使用maxResources去保证低延迟应用的资源 描述:假如我们需要一个队列去运行低延迟应用,我们假设集群有资源<memory:2000gb,vcores:10000>,我们为other_jobs设置maxResources,公平调度器将会为low_latency队列留出<memory:4000 gb, vcores:2000>的资源

<queue name="root">
    <queue name="low_latency"/>
    <queue name="other_jobs">
        <maxResources>16000 mb, 8000 vcores</maxResources>
    </queue>
</queue>

备注: 1.所有的application在other_jobs队列资源使用率之和不会超过80% 2.通过将大约20%的集群留给low_latency队列,应用程序可以尽快的运行 3.这只是提供一种案例,通常在很多情况下,最好使用下面的“使用抢占的低延迟应用队列”

场景三:通过抢占去保证低延应用的资源使用 描述:假如我们需要一个队列运行低延迟应用的场景,并且low_latency开打抢占功能

<queue name="root">
    <queue name="low_latency">
        <FairSharePreemptionThreshold>1.0</FairSharePreemptionThreshold>
        <FairSharePreemptionTimeout>1</FairSharePreemptionTimeout>
    </queue>
    <queue name="other_jobs"/>
</queue>

备注: 1.这个并不像maxResources版本,对于other_jobs来说,集群的所有资源对于它都是可用的,但对于low_latency队列的应用来说,other_jobs的资源可以被抢占用来运行application 2.如果你想限制low_latency的总资源使用,你可以加上maxResources 3.如果你想在FairScheduler开启抢占,你必须在yarn-site.xml上加上

<property>
    <name>yarn.scheduler.fair.preemption</name>
    <value>true</value>
</property>

场景四:为每个部门的应用分配资源队列 描述:为每个部门分配队列,在这个例子中,sales,marking,finance和data science每个部门都有相同的FairShare值

<queue name="root">
    <queue name="sales"/>
    <queue name="marketing"/>
    <queue name="data_science"/>
</queue>

除此之外,在sales队列里面还有northamerica和europe的子部门,我们可以配置成:

<queue name="root">
    <queue name="sales">
        <queue name="northamerica"/>
        <queue name="europe"/>
    </queue>
    <queue name="marketing"/>
    <queue name="data_science"/>
</queue>

场景五:绝对优先级队列 描述:这是一种优先级队列的替代方案 在上一个例子中,FairScheduler使用抢占去获取container的资源,在这个版本中,队列root.other和root.other.other将会设置其权重weight为0,会有以下的效果: 1.任何在优先级为1的队列当中,将会先获得机会分配资源,如果有空闲的资源才会分配到优先级为2的任务当中,最后的资源才会分配到优先级为3的资源。 2.如果每个队列所需求的总资源超出了集群资源的总量,那么优先级为2的队列将会在优先级为1的队列的资源需求量低于集群总量时才会开始运行,优先级2的任务的队列会在优先级为3的队列有限获得资源

<queue name="root">
    <queue name="priority1">
    </queue>
    <queue name="other">
        <weight>0</weight>
        <queue name="priority2">
        </queue>
        <queue name="other">
        <weight>0</weight>
        <queue name="priority3">
        </queue>
     </queue>
     </queue>
</queue>

注意: 如果抢占开启,所有提交到优先级为1的队列将会抢占优先级为2和3的队列,同理,提交到优先级为2的队列会抢占优先级为3队列的资源

场景六:使用抢占实现队列优先级 描述:基于下面的场景: 1.集群满负荷运行 2.优先级高的队列分配的资源低于其FairShare值 同时必须在FairScheduler中通过在yarn-site.xml中设置此属性来开启抢占:

<property>
    <name>yarn.scheduler.fair.preemption</name>
    <value>true</value>
</property>

以下是fair-scheduler.xml中的队列例子, 如果队列在60秒内未收到其FairShare的80%,则FairScheduler将开始抢占来自some_other_queue的应用程序并将资源提供给priority_queue。

<queue name="priority_queue">
    <weight>75.0</weight>
    <fairSharePreemptionThreshold>0.8</fairSharePreemptionThreshold>
    <fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
</queue>
<queue name="some_other_queue">
   <weight>25.0</weight>
</queue>

场景七:对root或parent队列进行限制 描述:在FairScheduler中,像maxRunningApps或maxResources这样的硬性限制会自上而下传递。 同样,在root队列上设置这样的属性将影响所有队列,在下面的例子中,root.parent1将maxRunningApps设置为1。因此,尽管在childA和childB队列中将maxRunningApps设置为大于1的值,但你只能运行一个应用程序。

<allocations>
    <queue name="root">
    <queue name="parent1">
        <maxRunningApps>1</maxRunningApps>
    <queue name="childA">
        <maxRunningApps>3</maxRunningApps>
    </queue>
    <queue name="childB">
        <maxRunningApps>3</maxRunningApps>
    </queue>
    </queue>
    </queue>
</allocations>

场景八:如何删除队列 描述:社区并没有提供直接的方式从命令行或者ui界面去删除队列,如果你更新了fair-scheduler.xml队列并在文件中移除了queue,他将会在下一次刷新中把队列移除

其他 应当注意的是,在开源的版本当中,当权值设置为0.0时,将会导致应用提交不到对应的队列当中,这是一个bug(YARN-5077),在社区版本在hadoop 2.9.0之后修复,新版本的EMR的hadoop在2.7.3的基础上修复了这个问题,所以可以正常的提交任务

参考文章

Using FairScheduler queue properties