导语
在腾讯云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的基础上修复了这个问题,所以可以正常的提交任务
参考文章
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。