admin管理员组

文章数量:1611902

Capacity Scheduler 的 Ordering Policy 用于决定资源分给谁的问题。 Ordering Policy 可以设置在队列间,也可以设置作用在队列内的作业,它们是不同的参数。

队列间排序规则的配置

以下配置设置队列 q1 的排序规则,用于对该队列的子队列进行排序。可选值有 “utilization” 和 “priority-utilization”,默认是 “utilization” 。

  • “utilization” 仅考虑资源的使用情况,不考虑优先级。
  • “priority-utilization” 考虑优先级。
<property>
   <name>yarn.scheduler.capacity.root.q1.ordering-policy</name>
   <value>utilization</value>
</property>

队列间排序规则的确定规则

  1. 如果当前队列设置了排序规则,则用当前队列的排序规则。
  2. 如果当前队列没有设置排序规则,但是父队列设置了排序规则,则用父队列的排序规则。
  3. 如果当前队列和各级父队列都没有设置排序规则,则用默认的 “utilization”。

队列间资源分配策略

  • “utilization” 仅考虑资源的使用情况,不考虑优先级。
    使用相对容量资源少的队列可以得到资源。

举例:
有两个队列 q1 和 q2。队列 q1 的 capacity 为 40, q2 的 capacity 为 60。
q1 使用了 20% 的集群资源,q2 使用了 50% 的集群资源。
现在 q1 使用的相对资源时 20%/40%=50%
队列 q2 使用的相对资源是 50%/60%=83%
这时资源分配给队列 q1。

  • “priority-utilization” 考虑优先级,队列有不同的优先级的情况下。

    如果各队列使用的资源都低于capacity,优先级高的队列可以得到资源。
    如果各队列使用的资源都大于等于 capacity,优先级高的队列可以得到资源。
    当一个队列使用的资源都低于capacity,而另一个队列使用的资源都大于等于 capacity,使用的资源都低于capacity 的队列可以得到资源。

队列优先级设置如下:

 <property>
   <name>yarn.scheduler.capacity.<queue-path>.priority</name>
   <value>10</value>
 </property>

队列内任务的排序规则

队列内两个作业比较的排序规则:
如果作业是同一用户的作业,按照比较器比较。比较器以下有介绍。
如果不同用户的作业,如果提交作业的用户使用的资源(除AM外)相同,则先提交的作业优先。如果提交作业的用户使用的资源(除AM外)不相同,则使用资源少的用户的作业优先。

比较器有三种: FIFO, FAIR 和自定义规则。子定义规则扩展 AbstractComparatorOrderingPolicy,实现相应的抽象方法。

队列内任务的排序规则的参数设置和队列间的排序规则的设置一样,但是配置不同的 value。一个队列要么是叶子队列,要么是非叶子队列。非叶子队列的设置作用于子队列的排序,叶子队列的设置作用于队列内作业的排序,不会有重叠。

<property>
   <name>yarn.scheduler.capacity.<queue-path>.ordering-policy</name>
   <value>fair</value>
</property>

FIFO

FIFO 实际上是两种比较器组成的。只有在第 1 中比较器相等时,才利于第 2 种比较器。
PriorityComparator:按照作业的优先级比较。
FifoComparator: 按作业的提交时间比较,先提高的优先。

代码如下

List<Comparator<SchedulableEntity>> comparators =
        new ArrayList<Comparator<SchedulableEntity>>();
comparators.add(new PriorityComparator());
comparators.add(new FifoComparator());
this.comparator = new CompoundComparator(comparators);

提交作业时,可以指定优先级,例如 MR 作业可以设置 mapreduce.job.priority=HIGH, MR 框架映射为 YARN 的优先级。也可以通过下面的命令调整作业优先级, 是一个整数。

yarn application -updatePriority <priority>

Fair

Fair 算法也是由两种比较器组成的。只有在第 1 中比较器相等时,才利于第 2 种比较器。
FairComparator:按照作业的优先级比较。
FifoComparator: 按作业的提交时间比较,先提高的优先。

List<Comparator<SchedulableEntity>> comparators =
   new ArrayList<Comparator<SchedulableEntity>>();
 comparators.add(new FairComparator());
 comparators.add(new FifoComparator());
 fairComparator = new CompoundComparator(
   comparators
   );

FairComparator 有一个重要的参数 enable-size-based-weight,就是按照现在使用的资源计算,还是根据需要的资源计算。默认根据现在使用的资源计算。

<property>
    <name>yarn.scheduler.capacity.<queue-path>.ordering-policy.fair.enable-size-based-weight</name>
    <value>true</value>
</property>

本文标签: CapacityHadooppolicyOrderingscheduler