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

导语

在腾讯云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

原文链接:http://blog.cloudera.com/blog/2017/02/untangling-apache-hadoop-yarn-part-5-using-fairscheduler-queue-properties/

原文作者:By Ray Chiang and Dennis Dawson

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

稍微有点难度的10道java面试题,你会几道?

1、jvm对频繁调用的方法做了哪些优化? 2、常见的攻击手段有哪些?如何防范? 3、restful api有哪些设计原则? 4、hessian是做什么用的?它的...

341100
来自专栏CLS日志服务

腾讯云CLS日志服务应用

*LogListener: 是腾讯云日志服务提供的日志采集 Agent,通过在服务器上安装loglistener可以实时采集指定路径上的日志,并对日志原始数据进...

45810
来自专栏24K纯开源

macOS下加载动态库dylib报"code signature invalid"错误的解决办法

一、现象描述       在macOS上搞开发也有一段时间了,也积攒了一定的经验。然而,今天在替换工程中的一个动态库时还是碰到了一个问题。原来工程中用的是一个静...

30850
来自专栏架构师之路

php使用tcp长连接的一种优化思路

一、面向人群 如果站点架构满足以下几点,那么本文的优化方案会非常适合: 1)使用php等脚本语言作为开发语言 2)需要连接后端服务,例如RPC服务、memcac...

40160
来自专栏我是攻城师

如何收集项目日志统一发送到kafka中?

44740
来自专栏ytkah

finecms设置伪静态后分享到微信不能访问怎么处理

  finecms设置伪静态后分享到微信不能访问,分享的链接自动增加了一串参数,类似这样的***.html?from=singlemessage&isappin...

32350
来自专栏编程微刊

基于mpvue的小程序项目搭建的步骤步骤1. 检查下 Node.js 是否安装成功

21230
来自专栏码农二狗

linux下自动备份网站数据到邮箱

14530
来自专栏编程微刊

前端页面实现报警器提示音效果

22820
来自专栏IMWeb前端团队

分享几个便利的工具软件

clover 官方网址:http://cn.ejie.me/ 方便的 Tab 页功能 要掌握功能强大,操作简单的标签页,只需记住Ctrl+T新开页面,Ctrl+...

20360

扫码关注云+社区

领取腾讯云代金券