CDH5.4.4基于yarn的公平调度器配置

时间:2023-02-05 14:38:02
  1. 公平调度器介绍
    • 简介
           
      公平调度器是一种赋予作业(app)资源的方法,目的是让所有的作业随着时间的推移,都能获得平均的资源。hadoop NG有能力调度多种不同类型的资源(CPU cores、memory)。默认情况下,公平调度器只公平得调度作业memory的使用,但是通过配置我们可以调度memery和CPU。当第一个作业提交到集群上运行时,该作业使用集群的所有资源,这时候别的作业提交到集群后,空闲的资源会分配给其他新提交的作业,最终每个作业会获得大致相同的资源。与hadoop默认维护的一个作业队列不同,这个特性让小作业在合理的时间内完成的同时又不“饿”到消耗较长时间的大作业。它也是一个在多用户间共享集群的简单方法。公平共享可以和作业优先权搭配使用——优先权像权重一样决定每个作业所需的所有资源大小。       
           调度器将作业组织放入很多“队列”,这些队列会公平的共享所有的集群资源。默认情况下,所有的用户共享一个名叫“defalut”的队列。如果一个作业指定请求某个队列,那么这个作业将被提交到该队列。另外,通过配置可以根据提交作业的用户来分配进入相应的队列。在每个队列内部,同样有一个调度策略调度在每个队列中运行的作业,默认的策略是基于内存的公平分配,但是也可以配置成FIFO或者基于不同类型资源的公平分配。队列可以按照层次结构来划分资源,并和权重一起按照一定的比例共享集群资源。
             
           除了提供公平共享方法外,公平调度器允许赋给队列保证最小共享资源,这个用在确保特定用户、群组或生产应用程序总能获取到足够的资源时是很有用的。当一个资源池包含作业时,它至少能获取到它的最小共享资源,但是当资源池不完全需要它所拥有的保证共享资源时,额外的部分会在其它资源池间进行切分。
             
           最后,公平调度器还可以限制每用户和每个队列的并发运行作业数量。当一个用户必须一次性提交数百个作业时,或当大量作业并发执行时,用来确保中间数据不会塞满集群上的磁盘空间。设置作业限制会使超出限制的作业被列入调度器的队列中进行等待,直到一些用户/队列的早期作业运行结束。系统会根据作业优先权和提交时间的排列来运行每个用户/队列中的作业。
    • 可插拔策略的分层次队列       
           
      公平调度器支持分层次的队列,所有队列从一个名叫“root”的队列往下排(相当于以root为一棵树的根节点,其他的队列都是该节点的子节点)。可利用的资源公平地分布在根队列中的子节点中。然后,子节点以同样的方式将资源分配给他们自己的子节点。作业可能只被安排在子节点队列。       
           队列的名字开始于它的parents的名字,以点作为分隔符。因此,一个作为root队列的子节点名为“queue1”的队列,将被称为“root.queue1”,依次类推。当提及队列名称的根部分是可选的,所以刚刚的队列可以叫做“queue1”。

             每个队列中运行的作业资源如何分配,除了自带的FIFO、公平策略(默认的)、加入权重的公平策略,用户还可以自己自定义其他的策略,实现的策略需要继承自org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy。
    • 作业自动加载到队列       
             公平调度器允许管理员配置策略,自动将作业提交到合适的队列中。根据提交作业的用户或者用户所在的组(linux下的用户和组的概念)或者是提交时主动指定的队列提交到相应的队列。策略由一组规则按顺序应用到传入的应用程序进行分类的。每项规则会将应用程序放入一个队列,拒绝它,或者继续到下一个规则。请参考下面的配置文件格式如何配置这些策略。
    • 配置项 
      yarn.scheduler.fair.allocation.file
      资源分配文件的路径,该文件包含配置每个队列的属性(下一章将会介绍具体有哪些属性)
      yarn.scheduler.fair.user-as-default-queue
      是否按照提交者的name作为默认的队列名字,不设置或者设置成false,所有的作业都共享一个“default”队列。该项的默认值是true。如果队列的资源策略在allocation file中配置了,那么该项忽略
      yarn.scheduler.fair.preemption
      是否启用抢占,默认是false
      yarn.scheduler.fair.preemption.cluster-utilization-threshold
      默认值0.8f,最多可以抢占到集群所有资源的80%
      yarn.scheduler.fair.sizebasedweight
      是否根据每个作业所需的资源大小来分配各个作业的资源,设置为true,作业的权重为lnE/log2(E是该作业所需的最大内存资源),默认值是false,在一个队列内部分配资源时,默认情况下,采用公平轮询的方法将资源分配给各个作业
      yarn.scheduler.fair.assignmultiple
      是否启动批量分配功能。当一个节点出现大量资源时,可以一次分配完成,也可以多次分配完成。默认情况下,该参数值为false。
      yarn.scheduler.fair.max.assign
      如果开启批量分配功能,可指定一次分配的container数目。默认情况下,该参数值为-1,表示不限制。
      yarn.scheduler.fair.locality.threshold.node
      当应用程序请求某个节点上资源时,它可以接受的可跳过的最大资源调度机会。当按照分配策略,可将一个节点上的资源分配给某个应用程序时,如果该节点不是作业期望的节点,可选择跳过该分配机会暂时将资源分配给其他作业,直到出现满足该作业所需的节点资源出现。通常而言,一次心跳代表一次调度机会, 而该参数则表示跳过调度机会占节点总数的比例,默认情况下,该值为-1.0,表示不跳过任何调度机会。
      yarn.scheduler.fair.locality.threshold.rack
      当应用程序请求某个机架上资源时,它可以接受的可跳过的最大资源调度机会。
      yarn.scheduler.fair.allow-undeclared-pools
      设置为true时,将使用默认设置创建在作业中指定但未明确配置的池。设置为false时,将在名为“default”的池中运行作业指定的未明确配置的池。此设置适用于应用程序明确指定某个池时以及应用程序运行所在的池的名称为与该应用程序关联的用户名的情况。
      yarn.scheduler.fair.update-interval-ms
      默认值500ms,锁住调度器重新进行计算作业所需资源的间隔
             以上是最新官网所有的配置项(时间点:2015-11-27),CDH5.4.4中还有其他几个配置项,如下:
      yarn.scheduler.increment-allocation-mb
      内存规整化单位,默认是1024,这意味着,如果一个Container请求资源是1.5GB,则将被调度器规整化为ceiling(1.5 GB / 1GB) * 1G=2GB
      yarn.scheduler.increment-allocation-vcores
      虚拟CPU规整化单位,默认是1,含义与内存规整化单位类似
    • 具体配置项
      • 队列(queue)
        minResources
        最少资源保证量,设置格式为“X mb, Y vcores”,当一个队列的最少资源保证量未满足时,它将优先于其他同级队列获得资源,对于不同的调度策略,最少资源保证量的含义不同,对于fair策略,则只考虑内存资源,即如果一个队列使用的内存资源超过了它的最少资源量,则认为它已得到了满足;对于drf策略,则考虑主资源使用的资源量,即如果一个队列的主资源量超过它的最少资源量,则认为它已得到了满足。
        maxResources
        最多可以使用的资源量,fair scheduler会保证每个队列使用的资源量不会超过该队列的最多可使用资源量。
        maxRunningApps
        最多同时运行的应用程序数目。通过限制该数目,可防止超量Map Task同时运行时产生的中间输出结果撑爆磁盘。
        maxAMShare
        限制用于运行作业的共享资源,该属性只能配置在叶子队列,设置成1.0f,am在该队列中可以获得100%的memory和cpu资源,设置成-1.0f禁用该项。默认值是0.5f
        weight
        默认值是1,设置成2队列将会有2倍的能力去获得自己需要的资源,是一个权重配比
        schedulingPolicy
        队列采用的调度模式,可以是fifo、fair或者drf。
        aclSubmitApps
        可向队列中提交应用程序的Linux用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。
        aclAdministerApps
        该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。
        minSharePreemptionTimeout
        最小共享量抢占时间。如果一个队列在该时间内使用的资源量一直低于最小资源量,则开始抢占资源。
        fairSharePreemptionTimeout
        公平共享量抢占时间。如果一个队列在该时间内使用资源量一直低于公平共享量的一半,则开始抢占资源。
        fairSharePreemptionThreshold
        队列资源抢占的阈值,如果队列等待了上一个选项的时间还没有获得资源,将从别的队列容器中抢占资源。
      • 用户(user)
        只有maxRunningApps这个配置项
      • userMaxAppsDefault
        未设置上一项的按照该配置指定app运行的个数
      • defaultFairSharePreemptionTimeout
        root队列的默认公平共享量抢占时间,会被root队列的fairSharePreemptionTimeout覆盖
      • defaultMinSharePreemptionTimeout
        root队列的默认最小共享量抢占时间,会被root队列的minSharePreemptionTimeout覆盖
      • fairSharePreemptionThreshold
        root队列的默认队列资源抢占的阈值,会被root队列的fairSharePreemptionThreshold覆盖
      • queueMaxAppsDefault
        队列默认最大可以运行的app的个数,会被maxRunningApps覆盖
      • queueMaxAMShareDefault
        队列默认最大的AM资源限制,会被maxAMShare覆盖
      • defaultQueueSchedulingPolicy
        队列默认采用的调度模式,会被schedulingPolicy覆盖,默认是fair
      • queuePlacementPolicy
        该项包含了一组告知调度器如何将作业放置进队列的规则。这些规则按照配置的顺序生效,可以包含参数,所有的规则接受一个“create”的参数,该参数表示该条规则是否能够创建一个新的队列,并且该参数默认是是true,如果设置成false该规则会将作业放置到一个没有在资源分配文件中中配置的队列,然后继续下一个规则。最后一条规则必须无法往下继续,有效的规则如下:
        specified
        作业提交到指定的queue中(提交者自己可指定),如果提交时未用参数指定队列,那么将进入“default”队列,如果提交时指定一个不存在的队列,那么该作业被拒绝。
        user
        作业按照提交者的name提交到相应的队列,name(队列名)中的“.”会被“_dot_”替换,如:用户“first.last”的队列名字为“first_dot_last”
        primaryGroup
        作业按照提交者所在的组(linux中的用户和组)提交到相应的队列,name(队列名)中的“.”会被“_dot_”替换,如:用户所属的组“one.two”的队列名字为“one_dot_two”
        secondaryGroupExistingQueue
        同上一个参数,组换成附属组(linux中组的概念)
        nestedUserQueue
        和user参数类似,不同点:该配置在任何parent queue中都能创建队列,二user配置只能在root队列下创建。
        default
        作业被提交到该配置的“queue”属性中,如果未指定“queue”,那么就提交到“root.default”队列中
        reject
        拒绝提交作业
    • 配置例子
      <?xml version="1.0"?>
      <allocations>
      <queue name="sample_queue">
      <minResources>10000 mb,0vcores</minResources>
      <maxResources>90000 mb,0vcores</maxResources>
      <maxRunningApps>50</maxRunningApps>
      <maxAMShare>0.1</maxAMShare>
      <weight>2.0</weight>
      <schedulingPolicy>fair</schedulingPolicy>
      <queue name="sample_sub_queue">
      <aclSubmitApps>charlie</aclSubmitApps>
      <minResources>5000 mb,0vcores</minResources>
      </queue>
      </queue>

      <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>

      <!-- Queue 'secondary_group_queue' is a parent queue and may have
      user queues under it -->
      <queue name="secondary_group_queue" type="parent">
      <weight>3.0</weight>
      </queue>

      <user name="sample_user">
      <maxRunningApps>30</maxRunningApps>
      </user>
      <userMaxAppsDefault>5</userMaxAppsDefault>

      <queuePlacementPolicy>
      <rule name="specified" />
      <rule name="primaryGroup" create="false" />
      <rule name="nestedUserQueue">
      <rule name="secondaryGroupExistingQueue" create="false" />
      </rule>
      <rule name="default" queue="sample_queue"/>
      </queuePlacementPolicy>
      </allocations>
  2. CDH5.4.4配置
    CDH中的配置比起原生apache的稍微简单,首先点开YARN (MR2 Included),然后在筛选器的输入框内输入fair,这样和公平调度相关的配置项就会全部显示出来,其中Fair Scheduler XML 高级配置代码段(安全阀)该选项输入的就是具体的xml配置。