揭秘Apache Hadoop YARN,第五部分:使用FairScheduler 队列属性

原文地址:

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

在Part 4 ,介绍了Apache Hadoop 中的FairScheduler常用的属性。在Part 5 中,会提供一些例子来展示这些属性的用法,单独或者组合使用,来满足各种常用的需求,如应用程序优先级和组织队列。

揭秘Apache Hadoop YARN,第五部分:使用FairScheduler 队列属性

示例:Best Effort队列

摘要: 创建一个“best effort”队列,当群集空闲时执行应用程序。

实现: 在FairScheduler中,如果一个队列权重位0.0,只有群集中有空余资源的时候才会去运行应用程序。换句话说,priority_jobs队列中的所有作业将首先被分配,然后FairScheduler才会将剩下的资源分配给best_effort_jobs队列。

<queue>

<queue>
<weight>0.0

note:

如果群集的资源被队列充分利用起来,那么这些队列的作业可能需要更长时间来完成。

警告:

在CDH的早期版本中有一个错误,其中值0.0将不能正常工作,但像0.01这样的值工作正常。 YARN-5077解决了该问题,位于CDH 5.7.3,CDH 5.8.2,CDH 5.9.0和更高版本中。

示例:使用maxResources保证低延迟应用程序的资源

摘要:具有运行具有特殊低延迟要求的应用程序的特殊队列。

实现:假设我们有一个具有以下资源的集群:<memory>。通过在other_jobs队列上设置maxResources属性,FairScheduler为low_latency队列留下<memory>。

<queue>
<queue>
<queue>
<maxresources>16000 gb,8000 vcores


注意:

  • 所有应用程序在other_jobs队列中的总利用率不能超过集群的80%。
  • 通过为low_latency队列留下约20%的集群资源,应用程序可以尽快启动.
  • 这种情况仅作为示例提供。在许多情况下,最好使用下面的“使用抢占的低延迟应用队列”例子。

示例: 使用抢占来保证资源到低延迟应用程序,而不损害利用率

摘要:拥有一个专门运行低延迟应用程序的队列。

实现:假设我们有一个具有以下资源的集群:<memory>. 。此配置将在low_latency队列上启用抢占。

<queue>
<queue>
<fairsharepreemptionthreshold>1.0
<fairsharepreemptiontimeout>1

<queue>


注意:

  • 与maxResources版本(参见上一个示例)不同,整个集群资源可用于other_jobs队列,但是又可以抢占other_jobs中的应用程序,以使low_latency队列启动应用程序运行。
  • 如果您仍希望限制low_latency队列的总集群使用率,可以应用maxResources。
  • 稍后还有两个优先级队列的示例显示如何以更复杂的方式使用抢占。
  • 提醒:要在FairScheduler中启用抢占,必须在yarn-site.xml中设置此属性:
<property>
<name>yarn.scheduler.fair.preemption
<value>true

示例:限制Ad-Hoc队列的大小

摘要:允许子ad-hoc队列具有maxResources设置

实现:通常,不能在ad-hoc队列上设置属性,因为它们没有在fair-scheduler.xml文件中定义。通过在some_parent队列上设置maxChildResources属性,该队列的任何子项(例如ad-hoc用户队列或ad-hoc组队列)将等效于 8192 mb,8 vcores maxResources>设置。

<queue>
<maxchildresources>8192 mb,8 vcores

注意:

此功能是在CDH 5.9.0中引入的新功能。

示例:组织队列

摘要:为每个组织提供其应用程序的队列。

实现:为每个组织提供一个队列,在这种情况下是sales, marketing, finance, 和 data science。每个团体获得相等份额的Steady FairShare。

<queue>
<queue>
<queue>
<queue>


分层实现:sales组织有northamerica和europe子队列。marketing组织有reports和website队列。 data_science组织具有priority和best_effort队列。

<queue>
<queue>
<queue>
<queue>
<queue>

<queue>
<queue>
<queue>

<queue>
<queue>
<weight>100.0

<queue>
<weight>0.0



示例:严格优先队列

摘要:这是一个优先级队列的替代方法。

实现:在前面的示例中,FairScheduler使用抢占来强制执行100/10/1的容器分配。在此版本中,root.other和root.other.other队列的权重为0.这具有以下效果:

1.priority1队列中的任何作业将首先完全分配,然后将任何备用资源分配给priority2队列中的作业。最后,之后的任何备用资源将被给予priority3队列

2.如果每个优先级队列都有超出集群容量的作业,则priority2队列中的作业将仅在priority1中所有作业的总资源需求低于集群容量后开始。对于priority2队列中的作业,优先级高于priority3队列中的作业也是如此。

3.如果将作业添加到priority1队列,那么当任务从队列priority2和priority3完成时,容器将分配给这些新作业。类似地,如果将新作业添加到priority2队列(并且假设priority1作业保持完全分配),那么当priority3队列中任务完成时,这些作业将获得容器。

<queue>
<queue>

<queue>
<weight>0
<queue>

<queue>
<weight>0
<queue>




注意:

  • 如果在所有队列上启用抢占,则添加到priority1队列中的任何作业将立即抢占priority2和priority3中的作业。类似地,priority2队列中的任何添加的作业将优先于priority3队列中的作业。
  • 可以根据需要添加许多级别的层次结构,以满足您的需求。
  • 如前面“Best Effort队列”示例中所述,在CDH的早期版本中存在一个错误,其中值0.0将不能正常工作,但真正微小的值(例如0.01)工作正常。

示例:使用抢占实现优先级

摘要:给定以下情况:(a)以容量运行的群集,以及(b)其分配低于其FairShare的“高优先级”队列。打开抢占保证资源在提供的超时值内可用。

实现:必须在FairScheduler中启用抢占,方法是在yarn-site.xml中设置以下属性:

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

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

<queue>
<weight>75.0
<fairsharepreemptionthreshold>0.8
<fairsharepreemptiontimeout>60

<queue>
<weight>25.0

示例:使用抢占实现多层次的优先级

摘要:当两个优先级级别不足以分隔作业优先级需求时,您可以使用三个级别的优先级和抢占。

实现:high_priority和medium_priority队列启用抢占。 low_priority队列不会启用抢占。为了防止medium_priority队列从high_priority队列抢占容器,我们还将在high_priority上设置allowPreemptionFrom属性。

<queue>
<queue>
<weight>100.0
<fairsharepreemptionthreshold>0.9
<fairsharepreemptiontimeout>120
<allowpreemptionfrom>false

<queue>
<weight>10.0
<fairsharepreemptionthreshold>0.5
<fairsharepreemptiontimeout>600

<queue>
<weight>1.0


注意:allowPreemptionFrom属性,在CDH 5.7.0中才引入。

为Oozie启动器作业设置单独的队列

摘要:当Oozie启动某个操作时,启动器作业需要使用一个MapReduce应用程序主文件与一个任务实际启动该作业。在Oozie同时启动许多操作的情况下,队列和或群集可能会使用Oozie Launcher MapReduce AM命中maxAMShare,这将导致死锁,因为任何随后的YARN应用程序无法启动AM

解决方案是将Oozie启动器作业放入单独的队列,并根据需要限制队列。

示例:

  • 在您的Oozie工作流中,将属性oozie.launcher.mapred.job.queue.name设置为指向Oozie启动器队列:
<property>
<name>oozie.launcher.mapred.job.queue.name
<value>launcher

在FairScheduler中,为启动器作业创建队列

<queue>
<maxrunningapps>10

note:

这不是FairScheduler的具体问题。然而,Oozie和YARN之间的这种相互作用是一个很常见的问题,这个问题在小集群上尤其常见。

将诸如maxResources或maxRunningApps之类的限制放在启动器队列上将有助于防止Oozie启动器作业对群集进行死锁。

在根或父队列上进行硬限制

摘要:在FairScheduler中,硬限制(如maxRunningApps或maxResources)自上而下传播。同样,在根队列上设置这样的属性将影响所有队列。

示例:root.parent1的maxRunningApps设置为1.因此,尽管在childA和childB队列中将maxRunningApps设置为大于1的值,但只能运行一个应用程序

<allocations>
<queue>
<queue>
<maxrunningapps>1
<queue>
<maxrunningapps>3

<queue>
<maxrunningapps>3




删除队列

摘要:没有直接的方法可以通过命令行或UI删除队列。但是,如果更新fair-scheduler.xml配置文件并删除文件中的队列,则在下一个调度程序配置刷新时,将删除队列。

解决方案:确保队列中的所有应用程序在实际更改配置之前具有状态FINISHED。在MR应用程序的情况下,还要确保它们保存在JobHistoryServer中。

FairScheduler抢占是全局的

摘要:FairScheduler中的抢占是全局性的。调度器查看高于其FairShare的所有队列,并去获取这些资源,将它们分配到低于它们的FairShare的队列。目前没有将抢占限制到队列子集的形式,或者只允许从queueA到queueB的抢占。

解决方案:allowPreemptionFrom属性用来控制是否允许抢占。未来版本的FairScheduler可能允许其他形式的控制或分组。

小群集但是有大量job

摘要:用户运行小型集群并不罕见,其中活动队列数(带有作业)与集群中的资源量(vcores或GB)相配。这可能发生在测试群集中。在小型群集中当太多的大作业提交到同一队列时,livelock的情况或者执行相当缓慢。

解决方案:考虑限制小型集群上的队列数。此外,还可以通过设置maxRunningApps属性来限制队列中正在运行的作业数。例如:

<queue>
<maxrunningapps>5

扩展阅读

要获得有关Fair Scheduler的更多信息,请查看在线文档(Apache Hadoop和Cloudera CDH 5.9.x)


分享到:


相關文章: