YARN调度:

YARN应用发出资源请求通过调度器来分配资源。YARN提供了多种调度器和可配置策略。

YARN中三种调度器,⑴FIFO调度器⑵容量调度器⑵公平调度器。

1.FIFO调度器

FIFO调度器将应用放置在一个队列中,然后按照提交的顺序运行应用,为队列中的第一个应用的请求分配资源,第一个应用的请求被满足后再一次为队列中下一个应用服务。

FIFO调度器简单易懂,不需要任何配置,但不适合共享集群。

2.容量调度器

一个独立的专门队列保证小作业提交就可以启动,由于队列容量是为队列中的作业所保留的。容量调度器允许多个组织共享一个Hadoop集群,每个组织可以分配到全部集群资源的一部分,每个组织被配置一个专门的队列,每个队列被配置为可以使用一定的集群资源。队列同时可以进一步层次划分,每个组织内的不同用户能够共享该组织队列所分配的资源,在一个队列内,使用FIFO调度策略来进行调度。

弹性队列

单个作业使用的资源不会超过其队列容量,如果队列中有多个作业,队列资源不够如何?如果有可用的空闲资源,即使会超出队列容量,容量调度器可能会将空余的资源分配给队列中的作业。

队列的层次结构:

yarn命令查看队列资源使用情况 yarn 队列_调度策略

则容器调度的配置文件capacity-scheduler.xml中:

<configuration>
  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>etc,home</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.etc.queues</name>
    <value>conf,network</value>
  </propert>
  <property>
    <name>yarn.scheduler.capacity.root.home.capacity</name>
    <value>40</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.etc.capacity</name>
    <value>60</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.etc.maximum-capacity</name>
    <value>75</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.etc.conf.capacity</name>
    <value>50</value>
  </property>
   <property>
     <name>yarn.scheduler.capacity.root.etc.network</name>
     <value>-1</value>
   </description>
   </property>
</configuration>

分析:YARN的队列以层级的方式呈现,上述配置中,有一个队列,root,home,etc,conf,network,

etc队列进一步被划分为conf和network两个容量都为50的队列,同时etc队列的最大容量被设置为75,即即使home队列不占用资源,etc队列也不会占用全部资源。但是其他队列没有最大容量限制,conf,network作业可能占用etc队列的所有容量。

队列的放置:

将应用放置在哪个队列中,取决于应用本身。在MapReduce中,可以通过mapreduce.job.queuename来指定,如果队列不存在,则提交时会发生错误。如果不指定队列,则应用将被放在一个名为“default"的默认队列中。

⑶公平调度器

不需要预留一定量的资源,因为调度器会在所有运行的作业之间动态平衡资源。第一个作业启动时,获得集群中所有的资源,当第二个作业启动时,它被分配集群的一半资源。

参考《Hadoop权威指南》