深入理解spark-两种调度模式FIFO,FAIR模式

前面我们应知道了一个任务提交会由DAG拆分为job,stage,task,最后提交给TaskScheduler,在提交taskscheduler中会根据master初始化taskscheduler和schedulerbackend两个类,并且初始化一个调度池;

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模式相关推荐

  1. 如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)

    如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode) 有网友问到一个相关问题就是:如何理解IIS 7中的应用程序池的管道模式,尤其是如何理解"托管模型( ...

  2. 【一雪前耻!】两种方法判断大小端模式

    废话不多说,直接上代码. 法一:指针法 #include <stdio.h>int main(){int a = 1;char p = *((char *) &a); ///< ...

  3. apache php 工作模式,PHP Apache中两种工作方式区别(CGI模式、Apache 模块DLL)

    搜索热词 对PHP在Apache中两种工作方式的区别(CGI模式.Apache 模块DLL)感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! Windows 下有两种方法使 ...

  4. n1怎么进入线刷模式_OPPO N1怎么进Recovery模式 两种OPPO N1进入Recovery模式方法

    Recovery模式是安卓手机特有的一种高级模式,在很多时候都可能用到,最常见的就是刷机中,经常需要进入Recovery模式.最近有网友问小编OPPO N1怎么进Recovery模式?其实很简单,可以 ...

  5. spark两种kafka偏移量维护方式

    1.spark可以通过checkpoint的方式来维护kafka的偏移量,配置简单,只需要配置checkpoint的路径就可以完成偏移量的维护,如果本身spark业务就采用了state状态,那么既不需 ...

  6. 一定要理解的两种常见软件开发体系结构(CS/BS结构)的区别!!!

    CS/BS架构 ==黄色标注部分重点注意== CS结构 BS结构 CS结构与BS结构比较 ==有问题可以在评论指正,欢迎讨论,谢谢大家!!== 黄色标注部分重点注意 CS结构 •CS(Client/S ...

  7. Spark 调度模式-FIFO和FAIR

    Spark 调度模式-FIFO和FAIR Spark中的调度模式主要有两种:FIFO和FAIR.默认情况下Spark的调度模式是FIFO(先进先出),谁先提交谁先执行,后面的任务需要等待前面的任务执行 ...

  8. oracle轮询方式循环输出,LGWR的两种模式(POST/WAIT和POLLING)

    11.2之前,oracle的lgwr写入模式为post/wait 11.2之后新增了polling模式,可以与post/wait模式自动切换 通过隐藏参数 _use_adaptive_log_file ...

  9. “直接基于成本法”与“模拟权益法”两种合并报表模式比较与分析:响应新准则

    "直接基于成本法"与"模拟权益法"两种合并报表编制模式比较与分析 --对新准则的响应(一) 在编制合并财务报表时,存在两种模式,一种方法是直接基于成本法编制,一 ...

最新文章

  1. AssertValid函数学习
  2. GANs和ODEs:数学建模的终结?
  3. 加密令牌与协议创新时代的到来
  4. Windows2003利用×××+NAT+静态路由表建立网通电信双线×××服务器
  5. 一个BADI中实施多个Implementation
  6. 版本控制工具——Git常用操作(下)
  7. Oracle11新特性——初始化文件管理
  8. 使用Python Seaborn和Pandas进行数据可视化
  9. shell while 结束循环_Shell脚本编程2 for循环/while循环
  10. Linux 命令整理-tailf
  11. 弹性波波长计算公式_弹性波,时域显式接口简介
  12. QT+VS开发界面入门(qt界面在VS2022实现自动生成槽函数)
  13. HTML实现图文混排效果
  14. GoLang json格式化输出
  15. tv.twitch.android,Twitch智能电视客户端
  16. 罗永浩以为×××短信给了马化腾一记暴击,实际……
  17. 2021-2027全球与中国低代码业务流程管理软件市场现状及未来发展趋势
  18. 写给安徽合肥高三的你——少年不惧岁月长,敢挽桑弓射玉衡
  19. vue3中的watch和watchEffect
  20. 计算电话费练习【20171121】

热门文章

  1. Windows下安装tensorflow-gpu/cpu教程
  2. Python学习系列day1-python基础
  3. python3随笔-梯度下降法
  4. 五个工业风满满的 Look-alike 算法
  5. 【NLP】Transformers 源码阅读和实践
  6. 【效率】NB,真PDF神处理工具!
  7. 【NLP】基于机器学习的文本分类!
  8. 【科研经验】学霸为什么不喜欢给学渣解题?
  9. 【机器学习基础】数学推导+纯Python实现机器学习算法4:决策树之ID3算法
  10. 如何发现 GitHub 上那些有趣好玩的项目?