一:什么是TaskSchedule

**
官网的解释
Low-level task scheduler interface, currently implemented exclusively by TaskSchedulerImpl.This interface allows plugging in different task schedulers. Each TaskScheduler schedules tasks for a single SparkContext. These schedulers get sets of tasks submitted to them from the DAGScheduler for each stage, and are responsible for sending the tasks to the cluster, running them, retrying if there are failures, and mitigating stragglers. They return events to the DAGScheduler.

**
TaskSchedule是一个低层次的任务调度接口,目前只有TaskScheduleImpl实现了它,这个接口允许使用不同的任务调度策略。每一个任务调度器只服务于一个SparkContext。TaskSchedule会从DAGSchedule那边获取每一个stage的tasks的集合,并且会负责将它们提交到集群上去运行,还会在任务失败的时候重新提交它们

二:什么是TaskScheduleImpl

官网的解释
Schedules tasks for multiple types of clusters by acting through a SchedulerBackend.
It can also work with a local setup by using a LocalBackend and setting isLocal to true.
It handles common logic, like determining a scheduling order across jobs, waking up to launch
speculative tasks, etc.
Clients should first call initialize() and start(), then submit task sets through the
runTasks method.
TaskSchedule

ScheduleBackend来调度不同类型的集群的任务
可以使用LocalBackend来处理local集群的任务
处理一些普通的逻辑,比如确定job之间的调度顺序,唤醒一些预测的任务
应该首先调用initialize和start方法,然后通过runTasks方法提交任务集
TaskScheduler与SchedulerBackend

三:总体的底层任务调度的过程如下:

a>TaskSchedulerImpl.submitTasks主要的作用是将TaskSet加入到TaskSetManager中进行管理;

b>SchedulableBuilder.addTaskSetManager: SchedulableBuilder会确定TaskSetManager的调度顺序,然后按照TaskSetManager的locality aware来确定每个Task 具体运行在哪个ExecutorBackend中。

c>CoarseGrainedSchedulerBackend.reviveOffers:给DriverEndpoint发送ReviveOffouers,ReviveOffouers本身是一个空的case object对象,只是起到触发底层资源调度的作用,在有Task提交或计算资源变动的是时候会发送ReviveOffers作为触发器。

d>在DriverEndpoint接受ReviveOffouers并路由到makeOffers具体的方法中,在makeOffers中,首先准备好所有可以用于计算的workOffers(代表了所有可用的ExecutorBackend中可以使用的Cores信息)

e>TaskSchedulerImpl.resourceOffers为每一个Task具体分配计算资源,输入是ExecutorBackend可用的cores,输出是TaskDescription的二维数组,在其中确定了每个Task具体运行在哪个ExecutorBackend;resourceOffers到底是如何确定Task具体运行在哪个ExecutorBackend上的?

i.通过Random.shuffle方法重新洗牌所有的计算资源以寻求计算的负载均衡

ii.根据每个ExecutorBackend的cores的个数声明类型为TaskDescription的ArrayBuffer数组

iii.如果有新的ExecutorBackend分配给我们的Job,此时会调用executorAdded来获得最新的完整的可用计算资源

iv.通过调用TaskSetManager的resourceOffers最终确定每个Task具体运行在哪个ExecutorBackend的具体的Locality Level

f>通过launchTasks把任务发送给ExecutorBackend去执行

四:解释

(1)Task默认的最大重试次数是4次。

(2)Spark应用程序目前支持两种调度器:FIFO、FAIR,可以通过spark-env.sh中的spark.scheduler.mode进行具体的设置;默认情况下是FIFO的模式。

(3)TaskScheduler中要负责为Task分配资源:根据计算本地性原则确定Task具体要运行在哪个ExecutorBankend中,此时程序已经具备集群中的计算资源了。

(4)TaskDescription中已经确定好了Task具体要运行在哪个ExecutorBankend中,而确定Task具体要运行在哪个ExecutorBankend中的算法是由TaskSetManager的resourceOffers决定的。

(5)数据本地优先级从高到低依次为:PROCESS_LOCAL, NODE_LOCAL, NO_PREF, RACK_LOCAL, ANY, 其中NO_PREF是指机器本地性。

(6)每个Task默认是采用一个线程进行计算的。

(7)DAGScheduler是从数据层面考虑preferedLocation的,而TaskScheduler是从具体计算Task角度考虑计算的本地性。

(8)Task进行广播时候,AkkFrameSize大小是128MB,如果任务大于等于128MB-200K的话,则Task会直接被丢弃掉,如果小于128MB-200K的话会通过CoarseGrainedSchedulerBackend去launchTask到具体的ExecutorBackend上。

Spark-TaskSchedule和TaskScheduleImpl解释和过程相关推荐

  1. Spark源码阅读——任务提交过程

    2019独角兽企业重金招聘Python工程师标准>>> Spark 源码阅读--任务提交过程 当我们在使用spark编写mr作业是,最后都要涉及到调用reduce,foreach或者 ...

  2. 在spark上构造随机森林模型过程的一点理解

    这篇文章仅仅是为了帮助自己理解在分布式环境下是如何进行随机森林模型构建的,文章中记录的内容可能不太准确,仅仅是大致上的一个理解. 1.特征切分点统计 不管是连续取值型特征还是离散取值型特征,分裂树结点 ...

  3. javascript代码解释执行过程

    javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...

  4. Spark源码打包编译的过程

    前言 上篇文章介绍了下 安装sbt环境 启动scala项目 安装SBT环境运行Scala项目 为什么要弄这个 因为我本来是想对spark源码编译部署 spark是用scala语言编译的 spark源码 ...

  5. zend解释php过程,Zend framework处理一个http请求的流程分析

    1, 首先是bootstrap过程,初始化程序里用到的资源 2, 创建一个Zend_Controller_Front实体,实现front controller模式,这个实体类会负责将http请求派遣到 ...

  6. spark DAGScheduler、TaskSchedule、Executor执行task源码分析

    摘要 spark的调度一直是我想搞清楚的东西,以及有向无环图的生成过程.task的调度.rdd的延迟执行是怎么发生的和如何完成的,还要就是RDD的compute都是在executor的哪个阶段调用和执 ...

  7. spark的suffer过程

    5. spark shuffle ​ what is shuffle? spark/mr作业在执行过程中,数据重排的过程,主要发生在mr的话,就在map输出和reduce输入的过程,如果在spark就 ...

  8. Spark任务输出文件过程详解

    文章目录 一.Spark任务输出文件的总过程 二.Commit细节分析 1.commitTask 介绍 1.1.判断是否需要commit 1.2.task的commit细节 2.commitJob 介 ...

  9. 图解Spark原理及实践----大数据技术栈12

    回顾:大数据平台技术栈 (ps:可点击查看),今天就来说说其中的Spark! 来自:ITPUB Spark 已经成为广告.报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到 ...

最新文章

  1. pandas Timestamp的用法
  2. 打开Office时出现“运行时错误91”问题的解决办法
  3. Python爬虫应用实战-爬取股票数据做分析
  4. Framebuffer的配置及应用——先转载留着,以后一定要弄懂
  5. 『C#基础』调用CMD的一个小工具
  6. 64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...
  7. 我参与的一个项目总结
  8. linux下安装 Sublime Text 3
  9. Statement对象最新解析
  10. PyTorch学习:参数初始化
  11. Git 分支 - 分支的新建
  12. SQL server不允许保存更改
  13. 分布式事务-LCN解决分布式事务
  14. 如何在长期地学习和工作中保持精力充沛?
  15. 排序算法7——图解快速排序(两种主元选择方法)以及CUTOFF时间测试
  16. 2个路由器串联做交换机共享网络的方法
  17. 吴军的数学通识讲义 读书笔记
  18. el-input实现防抖
  19. Servlet知识概括详解
  20. 世界上最顶尖的技术都在哪些国家?

热门文章

  1. maven的pom文件解析及配置
  2. Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1...
  3. vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)...
  4. java编译器源码详解_已更新至第8章 | LLVM 编译框架详解
  5. 【编译原理笔记16】代码优化:流图,常用代码优化方法, 基本块的优化
  6. springMVC浏览器接受json报406错误的解决方法
  7. 自动化测试中的测试执行自动化
  8. html如何写微信弹窗,微信小程序 自定义弹窗实现过程(附代码)_而已_前端开发者...
  9. 7月21日王者服务器维修,2020年7月21日王者荣耀世冠杯,GOG2:0EMC,实力碾压运营滴水不漏...
  10. java8 lambda表达式Stream对List常用操作总结