Fair Scheduler Queue Basics

示例:具有正在Running的应用程序的集群

假设我们有一个yarn集群,其总资源<内存:800GB,vcores 200>,有两个队列:root.busy(权重=1.0)和root.sometimes_busy(权重3.0)。通常有四种的场景:

场景A:root.busy队列applications序占满队列,root.sometimes_busy队列中有少量正在运行的applications(例如10%,即)。很快,大量applications在相对较短的时间窗口内添加到root.sometimes_busy的队列中。所有sometimes_busy队列中的新应用程序都将处于挂起状态,并在root.busy队列中container结束时变为active状态。如果root.busy队列中的任务相当短暂,则root.sometimes_busy队列中的应用程序将不会等待很长时间来分配容器。但是,如果root.busy队列中的任务需要很长时间才能完成,则root.sometimes_busy队列中的新应用程序将长时间处于挂起状态。在这两种情况下,由于root.sometimes_busy队列中的应用程序处于活动状态,root.busy队列中许多正在运行的应用程序将需要更长的时间才能完成。

场景B:root.busy队列和root.sometimes_busy队列都已满或接近满,都是活动和/或挂起的applications。在这种情况下,集群将保持充分利用。每个队列将使用其fair share,root.busy队列中的所有应用程序的总和使用集群资源的25%,root.sometimes_busy队列中的所有应用程序的总和使用剩余的75%。

那么,如何避免场景A呢?

一种解决方案是在root.busy队列上设置maxResources。假设在root.busy队列上将maxResources属性设置为集群的25%。由于maxResources是一个硬限制,root.busy队列中的应用程序将始终限制在总数的25%。因此,在可以使用100%集群的情况下,集群利用率实际上接近35%(root.sometimes_busy队列为10%,root.busy队列为25%)。

场景A将有显著的改进,因为集群上有空闲资源,这些资源只能用于root.sometimes_busy队列中的应用程序,但平均集群利用率可能较低

更多公平分享定义

  • Steady FairShare:队列的理论公平共享值。该值是根据集群大小和集群中队列的权重计算的。

  • Instantaneous FairShare:调度程序为集群中的每个队列计算的公平共享值。
    该值在两个方面不同于Steady FairShare:
    – 未为空队列分配任何资源。
    – 该值等于所有队列达到或超过容量时的Steady FairShare。

  • Allocation:等于队列中所有正在运行的应用程序使用的资源之和。

展望未来,我们将“Instantaneous FairShare ”简称为“FairShare”

The Case for Preemption

根据这些新的定义,前面的场景可以表述如下:

情景A

root.sometimes_busy队列的Allocations value为,FairShare value为

root.busy队列的Allocations value为,FairShare value为

情景B

两个队列的Instantaneous FairShare等于其稳定公平份额。

在场景A中,您可以看到两个队列的分配和Steady FairShare之间的不平衡。当容器从root.busy队列中释放并分配给root.sometimes_busy的队列时,资源将缓慢返回。

通过启用抢占,公平调度程序可以杀死繁忙队列中的容器,并更快地将它们分配到root.sometimes_busy的队列。

Configuring Fair Scheduler for Preemption

要启用抢占,请在yarn-site.xml中设置此属性:

yarn.scheduler.fair.preemption
true

然后,在FairScheduler分配文件中,可以通过fairSharePreemptionThresholdfairSharePreemptionTimeout在队列上配置抢占,如下例所示。fairSharePreemptionTimeout是队列在尝试抢占容器以从其他队列获取资源之前处于FairSharePreemptionReshold下的秒数


  
    1.0
  
  
    3.0
    0.50
    60
  

 
    
    
 

回想一下,root.sometimes_busy队列的FairShare是。这两个新属性告诉FairScheduler,root.sometimes_busy的队列将在开始抢占之前等待60秒。如果在这段时间内,FairScheduler没有收到50%的FairShare资源,FairScheduler可以开始杀死root.busy队列中的容器,并将它们分配到root.sometimes_busy的队列中。

需要注意的是:

fairSharePreemptionThreshold的值应大于0.0(设置为0.0类似于关闭抢占),但不大于1.0(因为1.0将向需要资源的队列返回所有的FairShare)。

此配置中的抢占将杀死root.busy队列中的容器,并将它们分配到sometimes_busy队列。
反向抢占不会发生,因为在root.busy队列上没有设置抢占属性。

抢占不会杀死sometimes_busy队列中应用程序A的容器,并将它们分配给sometimes_busy队列中的应用程序B。

如果未为给定队列或其parent队列之一设置fairSharePreemptionTimeout,并且未设置defaultFairSharePreemptionTimeout,则即使启用了抢占,此队列也不会进行抢占。

(注意:我们不会讨论队列上的minResourcesMinsharePremptionTimeout。目前建议使用FairShare抢占。)

你可能感兴趣的:(Fair Scheduler Queue Basics)