hadoop调度规则

一、什么是调度规则

什么是调度规则,在了解它之前我们需要先知道调度规则其在整个hadoop架构中所处的位置。然后带着以下两个疑问进行探索。

  1. 为什么会存在调度规则?
  2. 调度规则有哪些,其区别又是什么?

我们都知道原生hadoop的整个架构大致可以分为hdfs、yarn和mapreduce等。而其中yarn负责资源的分配、管理、调度等功能。是的,你已经发现,调度规则所应该在的层次就是yarn中。那么为什么会存在调度规则呢?这是因为在面对成千上万的大资源消耗量的程序前,如何合理保障每一个应用能够得到各自各自合适的资源,显得尤为重要。试想一下,如果一个需要运行时间长达几天甚至几个月的程序把分布式中的所有资源占去,后续只需要短暂运行的资源也需要等到该程序跑完之后才可以运行?这显然不切实际。
为解决上述难题,yarn为我们提供了三种调度规则,以应付我们生产环境中的需要:FIFO Scheduler(先进先出调度规则)、Capacity Scheduler(容器调度规则)、Fair Scheduler(公平调度规则)

注意:hadoop2.7.2之后默认使用Capacity Scheduler(容器调度规则)。

1.1、先进先出调度(FIFO)

在这里插入图片描述
当client提交了一个job到resourcemanager时,resourcemanager为其申请一个运行applicationmaster的容器空间,applicationmaster再根据job进行切片,分别在不同的节点中申请container并在其中运行真正的job。因为为FIFO调度,所以resourcemanager在申请所有container所需消耗资源的时候都是按照最大比例分配。因此后续来的job只能等待前面的job运行完毕才能获取计算资源。

1.2、容器调度(Capacity)

在这里插入图片描述
容器调度涉及到一个队列的概念,队列可以由用户分配,默认根队列为root,并附属一个子队列default,其树形结构表示为root.default。每个job任务被分配的资源都将被限制在各自队列配置的属性中。这里的属性是指用户在配置参数中分配给该队列的使用资源上限、抢占资源上限、所属用户以及可运行应用数等。当一个队列的job正在运行时,另一个队列的job也可在同一时间被分配得到资源运行,因此不会出现诸如FIFO中出现的应用等待的情况。但是值得一提的是,在叶结点,也即一个队列下如果没有其他队列,则此队列下的job按照FIFO的调度规则运行。

注意:如果不对某个队列进行强限制,则默认队列是可抢占其他队列的资源的,这保证了资源的充分利用,但也可能因此造成其他队列运行资源的减少。这种现象被称为“弹性队列”。

1.3、公平调度(Fair)

在这里插入图片描述
公平调度一般用的比较少,但在个别生产环境中它却极具效果。不同于容器调度和先进先出调度,它能实现真正意义上的job同时运行,即便是同一个队列下的job。它会根据job的优先级为依据,优先级越高分配给该job的资源就越多,但每个job都等得到该队列的资源。在资源有限的情况下,每个job理想情况下获得的资源(理想资源)和实际获得的资源(实际资源)存在差距,此差距被称为缺额。在同一队列中,缺额越大,该job优先级越高。

二、配置参数

以下介绍容器调度和公平调度的配置参数,先进先出调度是最简单的调度规则,不需要进行任何配置,所以在此不做介绍。

2.1、Capacity Scheduler

capacity-scheduler.xml

<configuration>
<property>
<name>yarn.scheduler.capacity.maximum-applications</name>
<value>10000</value>
<description>集群中允许同时处于等待和运行状态的应用程序上限,一旦超过此上限,后续提交的应用将会被拒绝。默认值为10000</description>
</property>

<!-- 
<property>
<name>yarn.scheduler.capacity.<queue-path>.maximum-applications</name>
<value>整数</value>
<description>单个队列中允许同时处于等待和运行状态的应用程序上限,一旦超过此上限,后续提交的应用将会被拒绝</description>
</property>
-->

<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.1</value>
<description>集群中可以用于运行Application Master的最大资源占比————控制最大并发活跃应用程序数量,默认0.2,即20%</description>
</property>

<!--
<property>
<name>yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent</name>
<description>队列中可以用于运行Application Master的最大资源占比————控制最大并发活跃应用程序数量</description>
</property>
-->

<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value>
<description> 资源计算的实现用于在调度器中比较资源。此处为默认值,表示只使用内存,然而DominantResourceCalculator用主导资源比较多维度资源,例如内存,CPU等等。值为java类名</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,user</value>
<description>在root队列下创建队列</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>50</value>
<description>该队列可占用的资源</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.capacity</name>
<value>50</value>
<description>该队列可占用的资源</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.queues</name>
<value>network,plan</value>
<description>创建队列</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.network.capacity</name>
<value>75</value>
<description>该队列可占用资源</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.plan.capacity</name>
<value>25</value>
<description>该队列可占用资源</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.user-limit-factor</name>
<value>0.25</value>
<description>允许单个用户最多可获取的该队列资源的倍数。默认值为1,确保单个用户无论集群有多空闲,永远不会占用超过队列配置的资源,如果该值超过1,则表示会抢占其他队列的资源</description>
</property>

<property>  
<name>yarn.scheduler.capacity.root.user.network.user-limit-factor</name>
<value>1</value>
<description>允许该队列下单个用户最多可获取该队列的资源,此处表示最多可获取本队列的所有资源</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.plan.user-limit-factor</name>
<value>1</value>
<description>允许该队列下单个用户最多可获取该队列的资源,此处表示最多可获取本队列的所有资源</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.maximum-capacity</name>
<value>85</value>
<description>该队列最大可使用资源,默认是-1,表示禁用</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.default.state</name>
<value>RUNNING</value>
<description>队列的状态,可以是RUNNING或者STOPPED</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.user.state</name>
<value>RUNNING</value>
<description>队列的状态,可以是RUNNING或者STOPPED</description>
</property>

<property>   
<name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
<value>*</value>
<description>限制哪些用户可向该队列中提交应用程序,默认为*,即所有</description>
</property>

<property>   
<name>yarn.scheduler.capacity.root.user.acl_submit_applications</name>
<value>*</value>
<description>限制哪些用户可向该队列中提交应用程序,默认为*,即所有</description>
</property>

<property>   
<name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
<value>*</value>
<description>限制那些用户可管理该队列中的应用程序</description>
</property>

<property>   
<name>yarn.scheduler.capacity.root.user.acl_administer_queue</name>
<value>*</value>
<description>限制那些用户可管理该队列中的应用程序</description>
</property>

<property>
<name>yarn.scheduler.capacity.node-locality-delay</name>
<value>40</value>
<description>调度器尝试调度container的次数,通常该值被设置成集群一个机架上的节点数,默认为-1,表示不启用该功能</description>
</property>
</configuration>

2.2、Fair Scheduler

公平调度规则我用的不多,参数方面没有做过于细致的整理和了解。在这里先空个位置,等有空再做个整理补上。还望各位读者见谅!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值