深入理解spark两种调度模式:FIFO,FAIR模式
深入理解spark-两种调度模式FIFO,FAIR模式
1.调度池比较
根据mode初始化调度池pool
def initialize(backend: SchedulerBackend) {this.backend = backend// temporarily set rootPool name to empty 这里可以看到调度池初始化最小设置为0rootPool = new Pool("", schedulingMode, 0, 0)schedulableBuilder = {schedulingMode match {case SchedulingMode.FIFO =>new FIFOSchedulableBuilder(rootPool)case SchedulingMode.FAIR =>new FairSchedulableBuilder(rootPool, conf)}}schedulableBuilder.buildPools()}
FIFO模式
这个会根据spark.scheduler.mode 来设置FIFO or FAIR,默认的是FIFO模式;
FIFO模式什么都不做,实现默认的schedulerableBUilder方法,建立的调度池也为空,addTasksetmaneger也是调用默认的;
可以简单的理解为,默认模式FIFO什么也不做。。
FAIR模式
fair模式则重写了buildpools的方法,读取默认路径 $SPARK_HOME/conf/fairscheduler.xml文件,也可以通过参数spark.scheduler.allocation.file
设置用户自定义配置文件。
文件中配置的是
poolname 线程池名
schedulermode 调度模式(FIFO,FAIR仅有两种)
minshare 初始大小的线程核数
wight 调度池的权重
override def buildPools() {var is: Option[InputStream] = Nonetry {is = Option {schedulerAllocFile.map { f =>new FileInputStream(f)}.getOrElse {Utils.getSparkClassLoader.getResourceAsStream(DEFAULT_SCHEDULER_FILE)}}is.foreach { i => buildFairSchedulerPool(i) }} finally {is.foreach(_.close())}// finally create "default" poolbuildDefaultPool()}
同时也重写了addtaskmanager方法
override def addTaskSetManager(manager: Schedulable, properties: Properties) {var poolName = DEFAULT_POOL_NAMEvar parentPool = rootPool.getSchedulableByName(poolName)if (properties != null) {poolName = properties.getProperty(FAIR_SCHEDULER_PROPERTIES, DEFAULT_POOL_NAME)parentPool = rootPool.getSchedulableByName(poolName)if (parentPool == null) {// we will create a new pool that user has configured in app// instead of being defined in xml fileparentPool = new Pool(poolName, DEFAULT_SCHEDULING_MODE,DEFAULT_MINIMUM_SHARE, DEFAULT_WEIGHT)rootPool.addSchedulable(parentPool)logInfo("Created pool %s, schedulingMode: %s, minShare: %d, weight: %d".format(poolName, DEFAULT_SCHEDULING_MODE, DEFAULT_MINIMUM_SHARE, DEFAULT_WEIGHT))}}parentPool.addSchedulable(manager)logInfo("Added task set " + manager.name + " tasks to pool " + poolName)}
这一段逻辑中是把配置文件中的pool,或者default pool放入rootPool中,然后把TaskSetManager存入rootPool对应的子pool;
2.调度算法比较
除了初始化的调度池不一致外,其实现的调度算法也不一致
实现的调度池Pool,在内部实现方法中也会根据mode不一致来实现调度的不同
var taskSetSchedulingAlgorithm: SchedulingAlgorithm = {schedulingMode match {case SchedulingMode.FAIR =>new FairSchedulingAlgorithm()case SchedulingMode.FIFO =>new FIFOSchedulingAlgorithm()}}
FIFO模式
FIFO模式的调度方式很容易理解,比较stageID,谁小谁先执行;
这也很好理解,stageID小的任务一般来说是递归的最底层,是最先提交给调度池的;
private[spark] class FIFOSchedulingAlgorithm extends SchedulingAlgorithm {override def comparator(s1: Schedulable, s2: Schedulable): Boolean = {val priority1 = s1.priorityval priority2 = s2.priorityvar res = math.signum(priority1 - priority2)if (res == 0) {val stageId1 = s1.stageIdval stageId2 = s2.stageIdres = math.signum(stageId1 - stageId2)}if (res < 0) {true} else {false}}
}
FAIR模式
fair模式来说的话,稍微复杂一点;
但是还是比较容易看懂,
1.先比较两个stage的 runningtask使用的核数,其实也可以理解为task的数量,谁小谁的优先级高;
2.比较两个stage的 runningtask 权重,谁的权重大谁先执行;
3.如果前面都一直,则比较名字了(字符串比较),谁大谁先执行;
private[spark] class FairSchedulingAlgorithm extends SchedulingAlgorithm {override def comparator(s1: Schedulable, s2: Schedulable): Boolean = {val minShare1 = s1.minShareval minShare2 = s2.minShareval runningTasks1 = s1.runningTasksval runningTasks2 = s2.runningTasksval s1Needy = runningTasks1 < minShare1val s2Needy = runningTasks2 < minShare2val minShareRatio1 = runningTasks1.toDouble / math.max(minShare1, 1.0).toDoubleval minShareRatio2 = runningTasks2.toDouble / math.max(minShare2, 1.0).toDoubleval taskToWeightRatio1 = runningTasks1.toDouble / s1.weight.toDoubleval taskToWeightRatio2 = runningTasks2.toDouble / s2.weight.toDoublevar compare: Int = 0if (s1Needy && !s2Needy) {return true} else if (!s1Needy && s2Needy) {return false} else if (s1Needy && s2Needy) {compare = minShareRatio1.compareTo(minShareRatio2)} else {compare = taskToWeightRatio1.compareTo(taskToWeightRatio2)}if (compare < 0) {true} else if (compare > 0) {false} else {s1.name < s2.name}}
总结:虽然了解一下spark的调度模式,以前在执行中基本都没啥用到,没想到spark还有这样的隐藏功能。
深入理解spark两种调度模式:FIFO,FAIR模式相关推荐
- 如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)
如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode) 有网友问到一个相关问题就是:如何理解IIS 7中的应用程序池的管道模式,尤其是如何理解"托管模型( ...
- 【一雪前耻!】两种方法判断大小端模式
废话不多说,直接上代码. 法一:指针法 #include <stdio.h>int main(){int a = 1;char p = *((char *) &a); ///< ...
- apache php 工作模式,PHP Apache中两种工作方式区别(CGI模式、Apache 模块DLL)
搜索热词 对PHP在Apache中两种工作方式的区别(CGI模式.Apache 模块DLL)感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! Windows 下有两种方法使 ...
- n1怎么进入线刷模式_OPPO N1怎么进Recovery模式 两种OPPO N1进入Recovery模式方法
Recovery模式是安卓手机特有的一种高级模式,在很多时候都可能用到,最常见的就是刷机中,经常需要进入Recovery模式.最近有网友问小编OPPO N1怎么进Recovery模式?其实很简单,可以 ...
- spark两种kafka偏移量维护方式
1.spark可以通过checkpoint的方式来维护kafka的偏移量,配置简单,只需要配置checkpoint的路径就可以完成偏移量的维护,如果本身spark业务就采用了state状态,那么既不需 ...
- 一定要理解的两种常见软件开发体系结构(CS/BS结构)的区别!!!
CS/BS架构 ==黄色标注部分重点注意== CS结构 BS结构 CS结构与BS结构比较 ==有问题可以在评论指正,欢迎讨论,谢谢大家!!== 黄色标注部分重点注意 CS结构 •CS(Client/S ...
- Spark 调度模式-FIFO和FAIR
Spark 调度模式-FIFO和FAIR Spark中的调度模式主要有两种:FIFO和FAIR.默认情况下Spark的调度模式是FIFO(先进先出),谁先提交谁先执行,后面的任务需要等待前面的任务执行 ...
- oracle轮询方式循环输出,LGWR的两种模式(POST/WAIT和POLLING)
11.2之前,oracle的lgwr写入模式为post/wait 11.2之后新增了polling模式,可以与post/wait模式自动切换 通过隐藏参数 _use_adaptive_log_file ...
- “直接基于成本法”与“模拟权益法”两种合并报表模式比较与分析:响应新准则
"直接基于成本法"与"模拟权益法"两种合并报表编制模式比较与分析 --对新准则的响应(一) 在编制合并财务报表时,存在两种模式,一种方法是直接基于成本法编制,一 ...
最新文章
- AssertValid函数学习
- GANs和ODEs:数学建模的终结?
- 加密令牌与协议创新时代的到来
- Windows2003利用×××+NAT+静态路由表建立网通电信双线×××服务器
- 一个BADI中实施多个Implementation
- 版本控制工具——Git常用操作(下)
- Oracle11新特性——初始化文件管理
- 使用Python Seaborn和Pandas进行数据可视化
- shell while 结束循环_Shell脚本编程2 for循环/while循环
- Linux 命令整理-tailf
- 弹性波波长计算公式_弹性波,时域显式接口简介
- QT+VS开发界面入门(qt界面在VS2022实现自动生成槽函数)
- HTML实现图文混排效果
- GoLang json格式化输出
- tv.twitch.android,Twitch智能电视客户端
- 罗永浩以为×××短信给了马化腾一记暴击,实际……
- 2021-2027全球与中国低代码业务流程管理软件市场现状及未来发展趋势
- 写给安徽合肥高三的你——少年不惧岁月长,敢挽桑弓射玉衡
- vue3中的watch和watchEffect
- 计算电话费练习【20171121】