热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yarn框架的调度总结

yarn框架的调度总结,Go语言社区,Golang程序员人脉社

可以参考文档http://blog.csdn.net/suifeng3051/article/details/49508261,这篇文章基本是比较详细得翻译了hadoop权威指南第四版的调度部分,下面的文章我主要把注意点总结一下,写的比较精简

一. 调度器的选择

yarn有三种调度器:FIFO Scheduler、Capacity Scheduler、Fair Scheduler
下图演示了三种调度的不同
三种调度方式对比

1.1 FIFO Scheduler

这种调度方式比较简单,不需要额外配置,单个job会占用掉所有资源,这样小任务可能被大任务阻塞一般不推荐使用,多用于其他调度的子队列中

1.2 Capacity Scheduler

针对不同的应用分配不同量的资源,可以保证小任务可以立即执行得到反馈,但和Fair Scheduler相比不能百分百发挥集群性能。在默认情况下使用Capacity Scheduler,但如果不给Capacity Scheduler配置对应的队列,其实和使用FIFO Scheduler是等价的。

1.3 Fair Scheduler

可以百分百发挥集群性能,并设置应用使用集群的比重,不过对于后面起来的任务有一定的滞后行,因为要等待之前的任务释放资源。

二. Capacity Scheduler

2.1 注意事项

  1. 由多个队列组成,队列可以有自己的子队列
  2. 队列中使用FIFO Scheduler方式调度
  3. 当一个队列中有两个及以上job,就会占用别的队列的空闲资源。可以通过设置队列资源最大比重,防止该队列侵吞过多资源。
  4. 当一个队列被别的队列占用资源后,开始执行一个任务,不会马上kill其他容器,而是等待资源释放。
  5. 应用中需要指定队列名称,否则会全部被塞入default队列(单个队列),也就是相当于在使用FIFO Scheduler,使用mapreduce.job.queue.name参数设置。

2.2配置举例

下面是Capacity Scheduler比较基础的配置,配置文件名称为capacity-scheduler.xml
这里写图片描述

以上位置生成队列层次为

root
├── prod
└── dev
    ├── eng
    └── science
  1. 所有的队列都是root队列的子队列。
  2. 配置文件中可以看到,root队列设置了两个子队列,prod和dev,然后在dev队列下又设置了两个子队列eng和science。
  3. prod队列占用了百分之40的资源,dev队列占用了百分之60的资源。
  4. dev队列设置了最大资源占用量为百分之75,也就是说prod最少情况下也有百分之25的资源可以立即使用。
  5. eng和science平分了dev的资源,也就是说在其中一个队列空闲并且prod队列也空闲的状态下,另一个可以占用集群最大为百分之75的资源。

2.3参数配置

这里写链接内容

三. Fair Scheduler

这里写图片描述

如图所示,Fair Scheduler也是有队列的概念的。队列A中的运行job1,一开始会占用所有集群资源,随后队列B中运行job2,随着计算job1的资源被释放,然后会分配给队列B计算job2,然后队列B中运行job3,队列A并不会释放资源,因为不是本队列中的任务,队列B会逐渐释放资源给job3。所以Fair Scheduler的计算有一定的迟滞行,但对整体效率来说是最优的。

3.1 注意点

  1. Fair Scheduler不是默认调度模式,需要在yarn中配置参数。(设置yarn.resourcemanager.scheduler.class为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler)
  2. 和Capacity Scheduler一样,所有队列都是root队列的子队列。
  3. 可以设置队列所占权重,默认权重是1。
  4. 可以通过配置文件设置队列的调度方式,有两种可以设置,defauleQueueSchedulingPolicy和schedulingPolicy。defauleQueueSchedulingPolicy设置默认队列调度方式。schedulingPolicy则针对单个队列设置调度方式会覆盖默认属性。
  5. 可以设置队列的最大最小资源,注意设置的最小资源并不是硬性指标,队列资源可以小于最小资源,这种情况下该队列获取资源的优先级就会比较高。一般设置最小资源是用来解决获取资源的优先级问题。
  6. 队列有三种配对原则,后面详细说明

3.2 配置举例

这里写图片描述

根据上图配置可以发现
1. 队列层次和上面Capacity Scheduler的配置例子是一致的
2. defaultQueueSchedulingPolicy设置到了fair就是表示在没有额外配置的情况下,队列使用Fair Scheduler。
3. prod队列配置了schedulingPolicy为fifo表示,只有prod队列使用FIFO Scheduler,其他所有队列使用默认配置的Fair Scheduler。
4. 队列中配置的数字是权重,上面的配置改成prod设置2, dev设置3效果是一样的。默认情况下,权重是1

3.3队列配对策略(queuePalacementPolicy)

根据上图设置的queuePlacemenetPolicy,可以Fair Scheduler更具有灵活性,可以自己定制队列配对原则。
元素定义了一个规则列表,其中的每个规则会被逐个尝试直到匹配成功。

如上面的例子:

<queuePlacementPolicy>
<rule name="specified" create="false" />
<rule name="primaryGroup" create="false" />
<rule name="default" queue="dev.eng" />
queuePlacementPolicy>
  1. 第一行表示使用specified策略,表示将应用放到名称匹配的队列中,如果这个应用没有指定队列名或队列名不存在,则说明不匹配这个规则,然后尝试下一个规则。
  2. 第二行使用primaryGroup,表示尝试把应用放在以用户所在的Unix组名命名的队列中,如果没有这个队列,不创建队列转而尝试下一个规则。
  3. 第三行使用default策略,表示把所有应用放到dev.eng队列中。

当然,我们可以不配置queuePlacementPolicy规则,调度器则默认采用如下规则:

<queuePlacementPolicy>
<rule name="specified" />
<rule name="user" />
queuePlacementPolicy>
  1. 匹配队列名称
  2. 使用user匹配队列,如果不成功以名称创建队列

还有一个简单的配置策略可以使得所有的应用放入同一个队列(default),这样就可以让所有应用之间平等共享集群而不是在用户之间。这个配置的定义如下:

<queuePlacementPolicy>
<rule name="default" />
queuePlacementPolicy>

3.4 抢占(preemption)

在Fair Scheduler中可以通过配置和参数设置抢占功能,就是杀掉别的应用的资源,来给自己使用,以提高应用的优先级。

  1. 通过设置一个全局的参数yarn.scheduler.fair.preemption=true来启用抢占功能。
  2. 有两种超时时间,一种是小于分配权重的超时抢占(fair share preemption timeout),一种是小于最小分配资源的超时抢占(minimum share preemption timeout)。
  3. 为所有队列配置最小超时时间。.元素来为某个队列指定最小超时时间
  4. 和则是分配权重超时。
  5. 上面提到的比例可以通过(配置所有队列)和(配置某个队列)进行配置,默认是0.5。

3.5 参数配置

这里写链接内容

四. 延迟调度(Delay Scheduling)

yarn所有的调度方式都会优先使用与数据距离更近的机器进行计算,这样可以节省网络开销。延迟调度就是在本地资源被使用时,调度中心会等待一会,如果等待时间中本地资源得到释放,就会调用本地资源。反之则使用较远的资源。

什么是调度机会:
每个node manager都会周期性的向调度中心发送节点信息(默认一秒),这些信息中包含了那些容器和资源是可被获得的。调度中心收到一次心跳,如果节点有资源可以被调用,就是一次调度机会。

Capacity Scheduler:
通过参数yarn.scheduler.capacity.node-locality-delay配置。是一个正整数,调度器尝试调度一个同机架不同节点的container之前,最多跳过的调度机会,通常而言,该值被设置成集群中机架数目,默认情况下为-1,表示不启用该功能

Fair Scheduler:
通过配置yarn.scheduler.fair.locality.threshold.node和yarn.scheduler.fair.locality.threshold.rack。
当yarn.scheduler.fair.locality.threshold.node设置为0.5表示,必须要超过集群中一半的节点都提供过调度机会,才会尝试不同节点相同相同机架的其他节点。
yarn.scheduler.fair.locality.threshold.rack同理类推,是不同机架的节点。

五. 判定资源比例(Dominant Resource Fairness)

在以前的框架中,资源单单指的是内存,现在yarn框架可以判断的资源可能包含两种及以上,例如cpu等等,这种情况下要怎么判断应用占用资源的比重。

举个例子:
一个集群有100个cpu和10TB的内存。应用A需要资源(2CPU, 300GB), 应用B需要资源(6CPU,100GB)。
那么A应用所占集群总资源(2%,3%), B应用所占集群总资源(6%, 1%)。
按照现行策略是取应用中占比大的作为其资源占比,那么
A就是要占用资源的3%,而B占用资源6%

在默认情况下Dominant Resource Fairness策略是没有被使用的,只看了内存资源,如果启用需要修改配置
Capacity Scheduler:
yarn.scheduler.capacity.resource-calculator为org.apache.hadoop.yarn.util.resource.DominantResourceCalculator

Fair Scheduler:
设置为drf。


推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
author-avatar
罗伯特1980_823
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有