当前位置: 首页 > news >正文

深入理解spark-taskScheduler,schedulerBackend源码分析

 

上次分析了dagshceduler是如何将任务拆分成job,stage,task的,但是拆分后的仅仅是一个逻辑结果,保存为一个resultstage对象,并没执行;

而将任务正在执行的是spark的taskscheduler模块和shcedulerbackend模块,

taskcheduler模块负责task的调度,schedulerbackend负责task的自愿申请,这两个结合比价紧密,实现也是在一起实现的;

 

点开sparkcontext的内部属性,可以看到taskscheduler的的对象(org.apache.spark.scheduler.TaskScheduler)是一个trait(Scala的叫法,简单的理解为类似于java的interface),这是因为task的提交方式有多种,可以是yarn-client模式,也可以是yarn-cluster模型,这取决于提交spark提交时候设置的参数master。

master设置不同,最终实现的也不同,当是yarn-client模式的时候,task实现方式则是yarnscheduler。

同样的schedulerbackend也是一个trait,具体的实现也是根据spark.master来决定,如果是yarn-client模式,实现则是yarnclientschedulerbackend。

 

具体看一下代码实现:

SparkContext#createTaskScheduler

sparkcontext中调用createtaskscheduler,根据master来决定生成的实际类型,taskscheduler,schedulerbackend

val (sched , ts) = SparkContext.createTaskScheduler(this, master) // 这里的master是"spark.master"参数的值,String类型
_schedulerBackend = sched//生成 schedulerBackend
_taskScheduler = ts//生成 taskScheduler
_taskScheduler .start()

 

进入到createtaskscheduler方法中,具体实现根据事master的模型,有yarn-client,yarn-cluster,local等;

我们只看yarn-client模式(平常用的比较多的时候,yarn-client模式的时候,driver在客户端,那么输出的日志也会在本地可以查看,yarn-cluster模式下driver是在资源管理器下的,首先日志不太方便查看),可以看到内部实现是根据match case来实现匹配的。yarn-clent模式下,schedulerbackend实现org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend,taskscheduler 实现org.apache.spark.scheduler.cluster.YarnScheduler;

 case "yarn-client" =>
        val scheduler = try {
          val clazz = Utils.classForName("org.apache.spark.scheduler.cluster.YarnScheduler")
          val cons = clazz.getConstructor(classOf[SparkContext])
          cons.newInstance(sc).asInstanceOf[TaskSchedulerImpl]

        } catch {
          case e: Exception => {
            throw new SparkException("YARN mode not available ?", e)
          }
        }

        val backend = try {
          val clazz =
            Utils.classForName("org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend")
          val cons = clazz.getConstructor(classOf[TaskSchedulerImpl], classOf[SparkContext])
          cons.newInstance(scheduler, sc).asInstanceOf[CoarseGrainedSchedulerBackend]
        } catch {
          case e: Exception => {
            throw new SparkException("YARN mode not available ?", e)
          }
        }

        scheduler.initialize(backend)
        (backend, scheduler)

 

在根据master获得了实际调度类型之后,并没有马上返回,而是调用了scheduler.initizlize(backend)

TaskSchedulerImpl#initialize

在这个方法中,可以看到是根据spark的调度模式初始化一个调度池,这里可以看到spark有两种调度模式(FIFO,FAIR两种模式);

def initialize(backend: SchedulerBackend) {
    this.backend = backend
    // temporarily set rootPool name to empty 这里可以看到调度池初始化最小设置为0
    rootPool = new Pool("", schedulingMode, 0, 0)
    schedulableBuilder = {
      schedulingMode match {
        case SchedulingMode.FIFO =>
          new FIFOSchedulableBuilder(rootPool)
        case SchedulingMode.FAIR =>
          new FairSchedulableBuilder(rootPool, conf)
      }
    }
    schedulableBuilder.buildPools()
  }

 

完成后会返回实际类型,然后启动taskscheduler.start()

 

启动了之后根据DAGscheduler提交的stage的类型,shufflestage还是resultstage去不同的执行:

TaskScheduler#submitTasks

 

未完待续.....

 

转载于:https://www.cnblogs.com/yankang/p/9782632.html

相关文章:

  • 神经网络之调参
  • 数组Array的API1
  • Linux下tomcat日志打印和传参乱码问题
  • React Native vs. Cordova.
  • BigDecimal使用中的一些注意事项
  • 4 - MySQL:多表查询
  • 运算
  • 走进软件第一次作业——组建团队 第四组作业
  • 部署 Django
  • react学习三
  • javascript编写带阴历的黄历
  • AS导入项目报错:Plugin with id 'com.android.application' not found.
  • 2018.10.17 NOIP模拟 管道(状压dp)
  • flask_sqlalchemy
  • Python语言程序设计基础(3)—— 基本数据类型
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 《剑指offer》分解让复杂问题更简单
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Docker下部署自己的LNMP工作环境
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • iOS 颜色设置看我就够了
  • IP路由与转发
  • JavaScript服务器推送技术之 WebSocket
  • Java小白进阶笔记(3)-初级面向对象
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • underscore源码剖析之整体架构
  • win10下安装mysql5.7
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于List、List?、ListObject的区别
  • 开发基于以太坊智能合约的DApp
  • 说说动画卡顿的解决方案
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 大数据全解:定义、价值及挑战
  • #### go map 底层结构 ####
  • #Z2294. 打印树的直径
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2.2w字)前端单元测试之Jest详解篇
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (8)STL算法之替换
  • (floyd+补集) poj 3275
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读40-45)图像描述1
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (四) 虚拟摄像头vivi体验
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转载)hibernate缓存
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)