Fair Scheduler

与Capacity Scheduler类似,Fair Scheduler以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用;当一个队列的资源有剩余时,可暂时将剩余的资源共享给其他队列。Fair Scheduler与Capacity Scheduler不同之处主要体现在以下几个方面:

  • 资源公平共享:在每个队列中,Fair Scheduler可选择按照FIFO、Fair或DRF策略为应用程序分配资源。Fair策略即平均分配,默认情况下,每个队列采用该方式分配资源
  • 支持资源抢占:当某个队列中有剩余资源时,调度器会将这些资源共享给其他队列,而当该队列中有新的应用程序提交时,调度器要为它回收资源。为了尽可能降低不必要的计算浪费,调度器采用了先等待再强制回收的策略,即如果等待一段时间后尚有未归还的资源,则会进行资源抢占;从那些超额使用资源的队列中杀死一部分任务,进而释放资源
  • 负载均衡:Fair Scheduler提供了一个基于任务数的负载均衡机制,该机制尽可能将系统中的任务均匀分配到各个节点上。此外,用户也可以根据自己的需求设计负载均衡机制
  • 调度策略灵活配置:Fiar Scheduler允许管理员为每个队列单独设置调度策略(当前支持FIFO、Fair或DRF三种)
  • 提高小应用程序响应时间:由于采用了最大最小公平算法,小作业可以快速获取资源并运行完成

1.1 Fair Scheduler功能介绍

Fair Scheduler的配置选项包括两部分:其中一部分在yarn-site.xml中,主要用于配置调度器级别的参数;另外一部分在一个自定义配置文件(默认是fair-scheduler.xml)中,主要用于配置各个队列的资源量、权重等信息

  1. 配置文件yarn-site.xml
    • yarn.scheduler.fair.allocation.file:自定义XML配置文件所在位置,该文件主要用于描述各个队列的属性,比如资源量、权重等
    • yarn.scheduler.fair.user-as-default-queue:当应用程序未指定队列名时,是否指定用户名作为应用程序所在的队列名。如果设置为false或者未设置,则所有未知队列的应用程序将被提交到default队列中,默认值为true
    • yarn.scheduler.fair.preemption:是否启用抢占机制,默认值是false
    • yarn.scheduler.fair.sizebasedweight:在一个队列内部分配资源时,默认情况下,采用公平轮询的方法将资源分配给各个应用程序,而该参数则提供了另外一种资源分配方式,即按照应用程序资源需求数目分配资源,需求资源数量越多,分配的资源越多。默认情况下,该参数为false
    • yarn.scheduler.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.increment-allocation-mb:内存规整化单位,默认是1024,这意味着,如果一个Container请求资源时1.5G,则将被调度器规整化为2G
    • yarn.scheduler.increment-allocation-vcores:虚拟CPU规整化单位,默认是1,含义与内存规整化单位类似
  2. 自定义配置:Fair Scheduler允许用户将队列信息专门放到一个配置文件(默认是fair-scheduler.xml),对于每个队列,管理员可配置以下几个选项:
    • minResources:最少资源保证量,设置格式为“X mb,Y vcores”,当一个队列的最少资源保证量未满足时,它将优先于其他同级队列获得资源。对于不同的调度策略,最少资源保证量的含义不同,即对于Fair策略,只考虑内存资源;对于DRF策略,则考虑主资源使用的资源量
    • maxResources:最多可以使用的资源量,Fair Scheduler会保证每个队列使用的资源量不超过该队列最多可使用的资源量
    • maxRunningApps:最多同时运行的应用程序数目
    • minSharePreemptionTimeout:最小共享量抢占时间。如果一个资源池在该时间内使用的资源量一直低于最小资源量,则开始抢占资源
    • schedulingMode/schedulingPolicy:队列采用的调度模式,可以是FIFO、Fair或者DRF
    • aclSubmitApps:可向队列中提交应用程序的用户列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表
    • aclAdministerApps:队列的管理员列表。一个队列的管理员可管理队列中的资源和应用程序,比如杀死队列中任意应用程序
  3. 管理员也可为单个用户添加maxRunningJobs属性限制其最多同时运行的应用程序数目。此外,管理员也可通过以下参数设置以上属性的默认值:
    • userMaxJobsDefault:用户的maxRunningJobs属性的默认值
    • defaultMinSharePreemptionTimeout:队里的minSharePreemptionTimeout属性的默认值
    • defaultPoolSchedulingMode:队列的schedulingMode属性的默认值
    • fairSharePreemptionTimeout:公平抢占资源时间。如果一个资源池在该时间内使用资源量一直低于公平共享量的一半,则开始抢占资源

1.2 Fair Scheduler实现
  1. 资源调度器收到资源申请后,将暂时将这些请求存放到一个数据结构中,以等待空闲资源出现后为其分配合适的资源
  2. 调度策略在队列间和队列内部可单独设置。对于叶子队列,它设置的调度策略决定了内部的应用程序调度策略;对于非叶子队列,它设置的调度策略决定了各子队列间的调度策略,比如一个叶子队列设置的调度策略是Fair,则它内部应用程序的调度策略是Fair,如果一个非叶子队列设置的调度策略是Fair,则它的子队列之间的调度策略是DRF
  3. 同Capacity Scheduler一样,Fair Scheduler采用了三级资源分配策略,即当一个节点上有空闲资源时,它会依次选择队列、应用程序和Container使用该资源:
    • 步骤1:选择队列
      • 从根队列开始,使用FIFO、Fair或者DRF策略对它的所有子队列进行排序,然后依次处理每个子队列。对于某个子队列,如果它是叶子队列,则直接返回,否则以该队列为根队列,继续按照以上方法查找叶子队列
    • 步骤2:选择应用程序
      • 在步骤1中选中一个叶子队列后,Capacity Scheduler会按照Fair策略对叶子队列内部的应用程序进行排序,并依次检查排序后的应用程序,以按照步骤3找到一个最合适的Container
    • 步骤3:选择Container
      • 对于同一个应用程序,它请求的Container可能是多样化的,涉及不同的优先级、节点、资源量和数量。当选中一个应用程序后,Capacity Scheduler将尝试优先满足优先级高的Container。对于同一类优先级,优先选择满足本地性的Container,它会依次选择node local、rack local和no local的Container
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值