YARN调度策略比较

来源:互联网 发布:万花成女捏脸数据 编辑:程序博客网 时间:2024/06/02 19:20

YARN总共提供了三种调度策略:CapacityScheduler,FIFO Scheduler,

FairScheduler

一 FIFOScheduler-先进先出调度策略

即所有的应用程序将按照提交顺序来执行,这些应用程序都放在一个队列里,只有在执行完了一个之后,在执行顺序执行下一个

 

缺点:

耗时长的任务会导致后提交的一直处于等待状态,资源利用率不高;如果集群多人共享,显然不太合理

 

二 CapacityScheduler

2.1由于FIFOScheduler的局限性,后来衍生出来了多个用户可以共享集群资源,然后集群资源按照队列为单位进行划分的调度器

2.2还可以控制每一个队列资源最低保障和最高使用限制,最高使用限制是防止过多占用空闲资源,而导致其他队列资源紧张

2.3还可以针对用户设置每个用户最高资源使用限制,以防止该用户滥用或者频繁使用资源

2.4每一个队列内部也是按照先进先出的原则调度资源

2.5如果某个队列资源使用紧张,某个队列比较资源有剩余,那么可以暂时把剩余的资源共享给资源比较紧张的队列,一旦共享资源的队列有应用程序提交,那么被共享资源的队列释放的资源会归还给该共享资源的队列(弹性队列)

2.6每一个队列有严格的访问控制,只有那些被允许的用户才可以查看该队列应用程序的状态

 

假设我们有如下层次的队列:

root

|-uat

|-dev

|-ecomerce

|-scicne

CapacityScheduler有自己的配置文件,即conf目录下的capacity-scheduler.xml

 

配置选项:

capacity:队列的资源容量比,所有对列的资源容量比之后不能超过100

maximum-capacity:该队列最多使用到集群资源的上限比

minimum-user-limit-percent:每一个用户最低资源百分比

user-limit-factor:每一个用户最多可用的资源百分比

 

maximum-applications:集群或者队列资源同时处于等待的和运行状态的应用程序数目上限,一旦超过此配置,后需提交的应用程序将会被拒绝。默认10000.

yarn.scheduler.capacity.maximum-applications:集群最大允许的应用程序总数

yarn.scheduler.capacity.<queue-path>.maximum-applications:队列允许最大的应用程序总数

maximum-am-resource-percent:集群中用于运行应用程序Application

Master的资源比例上限。用浮点数表示,0.1表示10%。所有队列的ApplicationMaster资源比例上限可通过参数yarn.scheduler.capacity.ma

ximum-am-resource-percent.设置

下面是一个简单的capacity-scheduler配置文件:

<configuration>

 

  <!--集群所允许的最大应用程序数量-->

  <property>

   <name>yarn.scheduler.capacity.maximum-applications</name>

    <value>10000</value>

  </property>

  <!--集群所允许的最大ApplicationMaster数量-->

  <property>

   <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>

    <value>0.1</value>

  </property>

  <property>

   <name>yarn.scheduler.capacity.resource-calculator</name>

   <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value>

  </property>

  <!--指定root下一层的所有队列,多个用逗号分割-->

  <property>

   <name>yarn.scheduler.capacity.root.queues</name>

    <value>uat,dev</value>

  </property>

  <!--指定dev下一层的所有队列,多个用逗号分割-->

  <property>

    <name>yarn.scheduler.capacity.root.dev.queues</name>

    <value>ecomerce,scicne</value>

  </property>

  <!--指定uat队列在系统都很繁忙的时候所占用Conatiner资源百分比-->

  <property>

   <name>yarn.scheduler.capacity.root.uat.capacity</name>

    <value>40</value>

  </property>

  <!--指定dev队列在系统都很繁忙的时候所占用Conatiner资源百分比-->

  <property>

   <name>yarn.scheduler.capacity.root.dev.capacity</name>

    <value>60</value>

  </property>

  <!--每一个用户可以用到最多资源百分比-->

  <property>

   <name>yarn.scheduler.capacity.root.default.user-limit-factor</name>

   <value>1</value>

  </property>

  <!--指定某个队列所占用Container资源上限百分比,因为我们知道如果uat队列空闲

       而如果dev所需要资源比较紧张,那么就可以把暂时剩余的资源比如uat队列的

         空闲资源使用,为了防止dev全部使用了剩余的空闲资源,然后uat队列无资源

         可用的情况,我们需要设一个最大限度值给dev队列;反之,我们没给uat设置

         这个最大限度之,那么dev资源空闲,uat需要Container资源紧缺,那么uat可

         以全部使用剩余的dev的剩余资源,比如下面配置,dev最多只能站到整个资源

         的70%,还可以剩余30%给uat队列应急-->

  <property>

   <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>

    <value>70</value>

  </property>

  <!--我们并没有指定ecomerce和scicne队列的maximum-capacity所占用百分比

      那么他们ecommerce和scicne中的job有可能会用到整个dev的资源,占总资源的

       75%-->

  <!--指定ecomerce队列在dev都很繁忙的时候所占用dev 队列Conatiner资源百分比-->

  <property>

   <name>yarn.scheduler.capacity.root.dev.ecomerce.capacity</name>

    <value>50</value>

  </property>

   <!--指定scicne队列在dev都很繁忙的时候所占用dev 队列Conatiner资源百分比-->

  <property>

   <name>yarn.scheduler.capacity.root.dev.scicne.capacity</name>

    <value>50</value>

  </property>

<!—队列状态:如果一个队列状态时STOPPED,则不能向其提交应用程序或者其子对列提交应用程序-->

  <property>

   <name>yarn.scheduler.capacity.root.prod.state</name>

    <value>RUNNING</value>

  </property>

  <property>

   <name>yarn.scheduler.capacity.root.dev.state</name>

    <value>RUNNING</value>

  </property>

 <!—限定哪些用户或者用户组可以向给定对列中提交应用程序-->

 <property>

<name>yarn.scheduler.capacity.root.prod.acl_submit_applications</name>

    <value>*</value>

  </property>

  <property>

   <name>yarn.scheduler.capacity.root.prod.acl_administer_queue</name>

    <value>*</value>

  </property>

  <property>

    <name>yarn.scheduler.capacity.node-locality-delay</name>

    <value>40</value>

  </property>

  <!--用于分配队列job的一个map列表-->

  <property>

   <name>yarn.scheduler.capacity.queue-mappings</name>

    <value></value>

  </property>

</configuration>

 

三 FairScheduler

试图为每一个任务均匀分配资源,比如当前集群只有一个任务A,那么A拥有整个集群资源,这时候又提交了一个任务B,这时候任务A和B平分资源。

主要特点:

3.1也是将集群资源以队列为单位进行划分

3.2我们也可以设定队列的所使用container资源的最低保障百分比和最高上限

3.3我们也可以针对每一个用户设置资源使用的最低保障和使用上限

3.4当一个队列资源紧缺,可以共享其他队列的资源

3.5我们可以根据的不同策略为应用程序分配资源,比如FIFO,Fair或者DRF,默认是Fair.这就说明2个应用程序可以个占用1/2的资源,三个应用程序可以个占用1/3的资源

3.6当某个队列有剩余资源时,调度器会将这些资源共享给其他队列;如果当该队列有新的应用程序提交时,调度器为他回收资源,采用的是先等待在抢占,等待一段时间后,尚有为归还的资源,则会进行资源抢占,怎么抢占呢?从那些超额的资源的队列杀死一部分任务,进而释放资源

3.7负载均衡:提供一个基于任务数目负载均衡机制,该机制尽可能将系统的任务均匀分配到各个节点上

 

yarn-site.xml关于公平调度的配置:

yarn.scheduler.fair.allocation.file:自定义XML配置文件所在位置,该文件主要用于描述各个队列属性,比如资源量,权重

yarn.scheduler.fair.user-as-default-name:当应用程序未指定队列名的时候,是否指定用户名作为应用程序所在队列名;如果未设置,那么所有的应用程序提交大default队列中,默认为true

yarn.scheduler.fair.preemption:是否启用抢占机制,默认为false

yarn.scheduler.fair.sizebaseweight:在一个队列分配资源时默认情况采用公平轮询的方式将资源分配给各个应用程序,而该参数提供了另外一种分配方式,按照应用程序资源需求数目进行资源分配,默认为fasle

yarn.scheduler.fair.assignmultiple:是否启动批量分配

yarn.scheduler.fair.max.assign:如果开启批量分配,可指定一次分配的Container数量

yarn.scheduler.increment-allocation-mb:内存资源规整化单位,默认1024,这意味着一个Container请求资源是1.5GB,则将被调整为ceiling

(1.5/1)*1GB=2GB

 

自定义配置文件,默认是fair-scheduler.xml

minResources:最少资源保证量,格式为 X mb,Y vcores,当一个队列最小资源保证量为满足,他将优先于其他队列获取资源。

maxResources:最多可以使用的资源量

maxRunningApps:最多同时运行的应用程序数目

schedulingMode/schedulingPolicy:队列采用的调度模式

aclSubmitApps:可向队列中提交应用程序的用户列表

minSharePreemptionTimeout:最小公向量抢占时间:即一个资源池在该时间内使用的资源量一直低于最小资源量,则开始抢占资源

<allocations>

  <defaultqueueschedulingpolicy>fair</defaultqueueschedulingpolicy>

      <queue name="uat">

<weight>40<weight>

       <schedulingpolicy>fifo</schedulingpocliy>

         <minResources>100 mb,100 vcores</minResources>

            <maxResources>150 mb,200vcores</maxResources>

           <maxRunningApps>200</maxRunningApps>

       <minSharePreemptionTimeout>300</minSharePreemptionTimeout>

      </queue>

      <queue name="dev">

<weight>60<weight>

         <minResources>30 mb,30 vcores</minResources>

           <maxResources>50 mb,50vcores</maxResources>

      </queue>

<queuename="eng" />

<queuename="science" />

<queueplacementpolicy>

      <rule name="specified"create="false"></rule>

      <rule name="primarygroup"create="false"></rule>

      <rule name="default"queue="dev.eng"></rule>

</queueplacementpolicy>

      <user name="userA">

           <maxRunningApps>400</maxRunningApps>

      </user>

      <userMaxAppsDefault>40</userMaxAppsDefault>

      <fairSharePreemptionTimeout>6000</fairSharePreemptionTimeout>

</allocations>

 

自定义2队列uat和dev,权重比40:60,也就是说不采用均分的策略。

每一个队列可以有不同的调度策略,默认是fair,此外还有fifo和DRF

四 CapacityScheduler和 FairScheduler的比较

4.1相同点=>

>都允许多用户共享集群资源

>都是以队列对资源进行划分

>都支持层级队列

>都可以进行队列所需资源最低保证和使用资源的最高上限

>资源紧缺的队列可以共享其他队列的空闲资源(或者集群的空闲资源)

>都可以针对用户设置最低资源保障和资源使用最高上限

>都可以对用户设置

 

4.2不同点=>

>是否支持负载均衡:

CapacityScheduler: 不支持负载均衡

FairScheduler: 支持负载均衡

>Container请求资源粒度不一样

CapacityScheduler: 请求资源的最小整数倍

FairScheduler: 可以根据内存规整化参数控制,粒度更小

>队列之间的资源分配方式:

CapacityScheduler优先选择资源使用率低的队列,然后队列中通过FIFO或者DRF策略进行调度

FairScheduler: 使用公平算法选择队列,然后在在队列中通过Fair、

FIFO或者DRF调度