jjzjj

大数据架构师一定要弄清楚Fair Scheduler和Capacity Scheduler

涤生大数据 2023-03-28 原文

1.项目背景

公司集群上千物理节点,存储容量100PB+,当前使用50PB左右,YARN的计算内存150Tb+,CPU 30000 Cores+。当前使用的CDH集群,因为性能瓶颈,需要迁移到自建的apache Hadoop3集群。CDH集群默认的是Fair Scheduler,Ambari(Hortonwork)默认使用Capacity Scheduler。CDH和HDP合并后,新的CDP会默认使用Capacity Scheduler调度器。所以如果需要将CDH群集迁移到CDP时,必须从Fair Scheduler迁移到Capacity Scheduler。迁移过程包括在迁移之前自动将某些Fair Scheduler配置转换为Capacity Scheduler配置,并在迁移之后进行手动微微调。

目前Hadoop3.x默认使用的是Capacity Scheduler,并且Capacity Scheduler支持了Node Labels机制,即通过给节点打标签的形式,让不同队列使用不同的标签节点进而更好地做计算资源隔离和资源保障。目前大公司来说使用Capacity Scheduler和Fair Scheduler的公司都有很多。至于FIFO调度器在生产上的使用几乎可以忽略不计。对于一家公司,中型集群规模的话,到底是选择Capacity Scheduler还是Fair Scheduler呢?从配置使用友好度,日常管理,生产上资源分配,拓展,实际使用经验等多个维度去考核对比一下两者的联系

2.Fair Scheduler和Capacity Scheduler的调研

现在随着hadoop3的更新,Fair Scheduler和Capacity Scheduler的功能性越来越同质化,相近。但是两者的之所以没有合并或者湮没一家,是因为本质上还是不同,都有一些自己的特质与特定的功能,在不同方向发挥着自己的余热。下面基于其重要的特性做了一些对比。

编号

比较类别

Fair Scheduler

Capacity Scheduler

1

是否支持多租户的使用

支持

支持

2

是否支持多队列的资源管理,支持队列的树状结构以及子队列

支持

都可以配置多个父队列,每个父队列下多个子队列

同一个父队列下的子队列资源分配值加起来可以不等于父队列,这样有利于提高父队列的资源利用率。但是实际使用最大小值会受父类的限制。

支持

都可以配置多个父队列,每个父队列下多个子队列

同一个父队列下的同一级别的子队列Capacity之和必须为100,比较麻烦。

3

支持队列的最小资源保障

支持

可以配置队列的最小资源,旧的格式支持固定值,新的配置格式支持百分比;vcores = X,memory-mb = Y”或“ vcores = X%,memory-mb = Y%。

同一级别的容量之和加起来可以超过100%

分配文件必须为XML格式

<<queue name =“ root”>
<minResources> 10000 mb,0vcores </ minResources>
<maxResources> 90000 mb,0vcores </ maxResources>
<maxRunningApps> 50 </ maxRunningApps>
<maxAMShare> 0.1 </ maxAMShare>
<weight> 2.0 </ weight></span>
支持,

默认配置百分比值或者小数

同一级别队列的容量总和必须100或者100%

比如30,表示占父队列的资源总和的30%。

尖叫提示:

不管是Fair Scheduler和Capacity Scheduler,如果当前队列没有任务提交时,是不会分配最小资源的,这个时候不保障最小资源,都是0。

如果该队列有任务提交时,需要等待当前集群释放资源时,才会分配满足最小资源的保证。也就说只有有任务跑时才会满足最小资源。

注意:当一个队列多个用户提交使用时,只保证整个队列的最小资源使用,不保证每个用户是否能有最小资源保证

默认资源分配都是以内存为调度单位的,但都支持CPU+内存

4

支持队列的最大资源限制

支持

配置格式同上,最小资源保障的配置。

尖叫提示:不管是Fair Scheduler和Capacity Scheduler队列的最大资源限制是队列可以使用的资源最大值,无论如何都不会超过这个值。

同样,如果父队列有最大值的限制,则子队列使用的资源总和不会超过父队列的最大值。也说明了每个用户的最大资源使用是有限制的。

支持,

默认配置百分比值或者小数

同一级别队列的容量总和必须100或者100%

比如30,表示占父队列的资源总和的30%。

5

队列之间资源共享与抢占

支持

当集群中有队列资源空闲时,其他供其他队列抢占使用,这是FS的重要特质

支持

当集群中有队列资源空闲时,其他供其他队列抢占使用,CP的抢占管理更加精细化,相比配置也更加麻烦。

6

支持队列内为不同队列配置不同的调度策略

支持

默认是基于内存的Fair share,也支持FIFO,以及多资源调度策略

不支持

7

支持限制队列内某个用户的最大资源使用量

不支持

尖叫提示:

Capacity Scheduler支持限制队列中每个用户可以使用多少资源。这样可以避免一个用户接管集群中的所有资源。

支持

可以通过配置参数,限制单个用户使用队列最大资源的百分比,防止单个用户独占整个队列资源

8

支持负载均衡机制

支持

Fair Schedule的负载均衡机制会将集群中的任务尽可能的分配到各个节点上

不支持

9

资源分配策略

FAIR,FIFO或者DRF

FIFO或者DRF,默认FIFO

10

支持任务抢占调度

支持

FS的抢占比较简单,直接计算权重比,所以可以任意配置整数权重值。

支持

11

队列的ACL权限控制

支持

支持
尖叫提示:均可以设置队列的使用提交人员ACL,但一个用户可以配置使用多个队列

12

限制队列或集群的最大并发Appplication的个数

支持

支持

yarn.scheduler.capacity.root.yarn_mobdi_prd.maximum-applications

尖叫提示:区别是Fair Scheduler调度,超出最大并发数比如40后,其他任务处理等待状态;而Capacity Scheduler超出后任务直,拒绝申请,抛出异常超出最大application的限制

13

限制基于用户的最大并发Appplication的个数

支持

不支持

14

限制AppMaster在队列/集群中最大资源使用

支持

支持

尖叫提示:这个限制的好处是防止集群中运行了很多APPMaster,也就是初始化了很多任务,因为本质上APPMaster就是一个container。进而没有资源给真正的计算任务运行,造成大量任务处于饥饿状态。

15

是否支持动态刷新配置文件

支持

支持

尖叫提示:刷新资源配置文件后,如增加队列,调整资源分配,比重,无需重启,一般10s后自动加载生效

16

是否支持Node Label

不支持

支持

尖叫提示:Node Label节点分区是一种基于硬件/用途将大型群集划分为几个较小的群集的方法。容量和ACL可以添加到分区。

17

是否支持动态调整container的大小

不支持
内存或者cpu不够的话,任务会被杀死

支持

yarn.resourcemanager.auto-update.containers默认值是false,应用程序可以根据工作负载的变化来更新其正在运行的容器的大小。不会杀死任务。

尖叫提示:敲黑板!单个container使用的最大资源不会超过机器分配NM的最大值

18

规整化因子,很重要

支持,FS内置了资源规整化算法,它规定了最小可申请资源量、最大可申请资源量和资源规整化因子,如果应用程序申请的资源量小于最小可申请资源量,则YARN会将其大小改为最小可申请量;如果应用程序申请的资源量大于最大可申请资源量,则会抛出异常,无法申请成功;yarn.scheduler.increment-allocation-mb和yarn.scheduler.increment-allocation-vcores

比如:YARN的container最小资源内存量为3G,规整因子是512Mb,如果一个应用程序申请3.2G内存,则会得到3.5内存。

不支持,

动态规划因子。比如:YARN的container最小资源内存量为3G,规整因子是512Mb,如果一个应用程序申请3.5G内存,则会得到6G内存。Fair Scheduler的资源增加是最小资源的整数倍。相比FS更加可以提高资源的利用率。

19

配置方式

Fair Scheduler使用嵌套的xml配置来模仿队列的层次结构,比传统的Hadoop风格的配置更加直观

通过.的形式配置a.b.c

尖叫提示:相比后者,Fair Scheduler使用的配置更加方便,直观,好吧就是简单。

20

数据局部特性

支持

数据本地计算策略的百分比

yarn.scheduler.fair.locality.threshold.node

yarn.scheduler.fair.locality.threshold.rack

默认值是-1,0表示不放弃任何调度机会。正常值配置在0-1之间。

支持

Capacity Scheduler利用“延迟调度”来遵守任务局部性约束。有3个级别的位置限制:节点本地,机架本地和关闭交换机。当无法满足地点要求时,调度程序会计算错过的机会的数量,并等待此计数达到阈值,然后再将地点约束放宽到下一个级别

尖叫提示:这个对于任务本地化的控制有用,尤其对于带宽紧张的集群。

3.最后的最后

3.1 Fair Scheduler

  • Fair Scheduler是资源池概念,大家共享这个池子里面的资源。
  • 多队列多租户使用时,可以根据业务线,部门,队列的实际使用情况,根据每个队列的日均最小使用资源给队列配置一个min resource,保证这个队列的任务可以满足最低运行需求。同时为了防止单个队列过多占用集群的资源,可以通过设置max resource限制队列使用资源上线。但是max resource谨慎使用,设置不合理可能降低集群的资源使用率。
  • 在满足了不同队列最小使用资源的保障后,再根据实际应用场景,给不同的队列配置不同的权重,最后FS会根据权重来为各个对列的资源池(各个对列还有子队列)分配资源(这种抢占的按照权重分配的方式本质和capacity 分配一样)。权重的设置相对capacitye很灵活,想增加权重直接修改权重整数值即可,FS会将各个对列的权重值求和。用当前队列权重值/总和的形式分配资源,其实也就是按所占的百分比分配资源。这种方式有利于动态调整资源池的使用。同一级别的队列可以设置权重进行资源分配抢占。同一个父队列的子队列之间的资源也可以通过配置权重来进行资源分配抢占,注意子队列只抢占父队列的资源。
  • 如下,队列的生产配置情况。可以通过权重,限制并发,最小资源,最大资源,调度策略等方式保证队列任务的稳定调度。

  • 可以结合公司实际不同部门的资源使用情况,比如A部门主要晚上用,B部门主要夜里用,配置早晚两套或者N套资源队列分配配置文件,通过调度自动更新配置文件,yarn会每隔10s去更新读取一次配置文件,这样在无感知的情况下更加有利于调高集群的吞吐率。

3.2 Capacity Scheduler

  • 相比Capacity Scheduler 是一个队列概念,新增一个任务,如果发现资源不够了,则根据FIFO规则排队;什么时候资源够了,再用。
  • Fair Scheduler可以配置自动创建pool,但是Capacity则无法创建队列;其实本质差别就是在于一个是pool共享资源的概念。对于FS而言,可以使用资源池中未被使用的资源,但是Capacity则不允许;所以前者比较灵活,后者相对呆滞。

3.3 建议

如果是中小型集群,上千节点以内,资源比较紧张,建议使用Fair Scheduler,配置简单,对资源的使用效率也高。相比Fair Scheduler更加灵活,允许作业使用群集中未使用的资源。它通过基于定义的权重来给任务的公平抢占和稳定提供保证。对于中小型集群,这是一个很好的默认设置。

容量调度程序对于资源的管理更加细化,配置起来也是调度器中最麻烦的。其使用资源配额定义队列。作业不能消耗额外的资源。这需要更多的配置和不断的试错,调整容量规划。所以它更加适合不同工作负载且具有不同需求的大型集群。比如大几千,上万,类似阿里巴巴那样的集群。

参考资料:

https://docs.cloudera.com/cdp/latest/data-migration/topics/cdp-data-migration-yarn-scheduler-migration.html

Apache Hadoop 3.3.4 – YARN Node Labels

​https://www.quora.com/Apache-Hadoop-Whats-the-difference-between-Fair-Scheduler-and-Capacity-Scheduler​

本文转载自微信公众号「涤生大数据」,作者「涤生大数据」,可以通过以下二维码关注。

转载本文请联系「涤生大数据」公众号。

有关大数据架构师一定要弄清楚Fair Scheduler和Capacity Scheduler的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  5. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  6. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  7. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐