YARN回顾(六)——调度器

版权声明:本文为博主原创文章,欢迎转载并注明出处。 https://blog.csdn.net/wangxiaotongfan/article/details/81672095

在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler。

  1. FIFO Scheduler

    FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。

  2. Capacity Scheduler

    Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。

    在正常的操作中,Capacity调度器不会强制释放Container,当一个队列资源不够用时,这个队列只能获得其它队列释放后的Container资源。当然,我们可以为队列设置一个最大资源使用量,以免这个队列过多的占用空闲资源,导致其它队列无法使用这些空闲资源,这就是”弹性队列”需要权衡的地方。

    配置方法:

    Capacity调度器的配置文件,文件名为capacity-scheduler.xml

    
    # 例如以下队列
    
    root
    ├── prod 40%
    └── dev 60% ~ 75%
     ├── eng 50%
     └── science 50%

    上面队列配置如下:

    <?xml version="1.0"?>
    <configuration>
       <!-- 定义了两个子队列prod和dev -->
       <property>
           <name>yarn.scheduler.capacity.root.queues</name>
           <value>prod, dev</value>
       </property>
    
       <!-- dev队列又被分成了eng和science -->
       <property>
           <name>yarn.scheduler.capacity.root.dev.queues</name>
           <value>eng, science</value>
       </property>
    
       <!-- 队列prod占40%的容量 -->
       <property>
           <name>yarn.scheduler.capacity.root.prod.capacity</name>
           <value>40</value>
       </property>
    
       <!-- 队列dev占60%的容量 -->
       <property>
           <name>yarn.scheduler.capacity.root.dev.capacity</name>
           <value>60</value>
       </property>
    
       <!-- 限制dev的最大资源伸缩比重为75%,所以即使prod队列完全空闲dev也不会占用全部集群资源 -->
       <property>
           <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
           <value>75</value>
       </property>
    
       <!-- 队列eng占50%的容量,由于没有设置最大值,所以可能占用整个父队列的资源 -->
       <property>
           <name>yarn.scheduler.capacity.root.dev.eng.capacity</name>
           <value>50</value>
       </property>
    
       <!-- 队列science占50%的容量,由于没有设置最大值,所以可能占用整个父队列的资源 -->
       <property>
           <name>yarn.scheduler.capacity.root.dev.science.capacity</name>
           <value>50</value>
       </property>
    </configuration>

    Capacity容器除了可以配置队列及其容量外,我们还可以配置一个用户或应用可以分配的最大资源数量、可以同时运行多少应用、队列的ACL认证等。

    在MapReduce中,我们可以通过mapreduce.job.queuename属性指定要用的队列。如果队列不存在,我们在提交任务时就会收到错误。如果我们没有定义任何队列,所有的应用将会放在一个default队列中。

    注意:对于Capacity调度器,我们的队列名必须是队列树中的最后一部分,如果我们使用队列树则不会被识别。即不能写成dev.eng,应该写为eng。

  3. Fair Scheduler

    Fair调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。举个例子,假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。

    
    # 启用Fair调度器
    
    
    # yarn-site.xml中配置
    
    <property>
       <name>yarn.resourcemanager.scheduler.class</name>
       <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    </property>
    
    # 队列的配置
    
    
    # 配置文件为fair-scheduler.xml
    
    
    # 可以通过下面配置修改配置文件路径(yarn-site.xml中)
    
    <property>
       <name>yarn.scheduler.fair.allocation.file</name>
       <value>xxxxx</value>
    </property>
    
    # fair-scheduler.xml配置例
    
    <?xml version="1.0"?>
    <allocations>
       <!-- 默认调度策略,如果没有配置这项,默认fair -->
       <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
       <queue name="prod">
           <!-- 权重,如果没有配置默认为1 -->
           <weight>40</weight>
           <schedulingPolicy>fifo</schedulingPolicy>
       </queue>
       <queue name="dev">
           <weight>60</weight>
           <queue name="eng"/>
           <queue name="science"/>
       </queue>
       <!--
       queuePlacementPolicy元素定义规则列表,会逐个尝试直到匹配成功。
       第一个规则specified,则会把应用放到它指定的队列中,若这个应用没有指定队列或队列名不存在,则不匹配这个规则;
       primaryGroup规则会尝试把应用以用户所在的Unix组名命名的队列中,如果没有这个队列,不创建队列转而尝试下一个;
       当前面所有规则不满足时,则触发default规则,把应用放在dev.eng队列中
       -->
       <queuePlacementPolicy>
           <rule name="specified" create="false"/>
           <rule name="primaryGroup" create="false"/>
           <rule name="default" create="dev.eng"/>
       </queuePlacementPolicy>
    </allocations>

    抢占(Preemption)

    当一个job提交到一个繁忙集群中的空队列时,job并不会马上执行,而是阻塞直到正在运行的job释放系统资源。为了使提交job的执行时间更具预测性(可以设置等待的超时时间),Fair调度器支持抢占。

    yarn.scheduler.fair.preemption=true启动抢占,如果队列在minimum share preemption timeout指定的时间内未获得最小的资源保障,调度器就会抢占containers。顶级元素为所有队列配置这个超时时间;还可以在元素内配置元素来为某个队列指定超时时间。

    与之类似,如果队列在fair share preemption timeout指定时间内未获得平等的资源的一半(这个比例可以配置),调度器则会进行抢占containers。这个超时时间可以通过顶级元素和元素级元素分别配置所有队列和某个队列的超时时间。上面提到的比例可以通过(配置所有队列)和(配置某个队列)进行配置,默认是0.5。

猜你喜欢

转载自blog.csdn.net/wangxiaotongfan/article/details/81672095