Spark源码剖析(九):TaskScheduler原理与源码剖析
接着上期内核源码(六)的最后,DAGSchedule会将每个Job划分一系列stage,然后为每个stage创建一批task(数量与partition数量相同),并计算其运行的最佳位置,最后针对这一批task创建一个TaskSet对象,调用submitTasks方法提交TaskSet到TaskSchedule
。那么这篇文章我们来剖析TaskScheduler接收到TaskSet后会进行的一系列操作。
taskScheduler.submitTasks(
new TaskSet(tasks.toArray, stage.id, stage.newAttemptId(), stage.jobId, properties))
- 创建TaskSetManager负责某一个TaskSet任务执行情况的监控和管理
- 调用SparkDeployScheduleBackend的reviveOffers方法。
val manager = createTaskSetManager(taskSet, maxTaskFailures)
backend.reviveOffers()
果然在父类CoarseGrainedSchedulerBackend中找到了reviveOffers方法,发送reviveOffers消息给driverActor。
紧接着我们来看看driverActor线程收到reviveOffers消息后如何处理
new DriverActor(properties)可以看到DriverActor类是CoarseGrainedSchedulerBackend中的类部类
可以看到driverActor线程收到reviveOffers消息后调用了makeOffers()方法:
- 调用TaskScheduleImpl的resourceOffers方法,执行任务分配算法,将各个task分配到Executor上去。
- 分配好task到executor之后,执行自己的launchTasks方法,将分配的task发送LaunchTask消息
到对应的Executor上去,由Executor启动并执行task。
new WorkerOffer()代表每个Executor上空闲的资源
scheduler.resourceOffers() 任务分配算法入口
任务分配算法核心:
双重for循环,第一层遍历所有taskset,第二层遍历每一种本地化级别(从优到劣)
本地化级别:
* PROCESS_LOCAL:进程本地化,RDD的partition和task进入同一个Executor内,那么速度当然快
* NODE_LOCAL:RDD的partition和task在同一个worker节点上
* NO_PREF:无,没有所谓的本地化级别
* RACK_LOCAL:机架本地化,RDD的partition和task在同一个机架上
* ANY:任意的本地化级别
launchedTask = resourceOfferSingleTaskSet(
taskSet, maxLocality, shuffledOffers, availableCpus, tasks)
taskSet.resourceOffer(execId, host, maxLocality)
Scheduler.resourceOffers方法最终会返回已经分配好Executor的任务列表tasks。
launchTasks方法会接收tasks列表作为参数,通知对应的Executor启动相应的task
至此TaskSchedule处理TaskSet的流程已经全部结束,我们稍作总结:
- 当TaskScheduler接收到从DAGScheduler提交过来的TaskSet时,首先给每个TaskSet都创建一个TaskSetManager负责管理和监控该TaskSet。
- 接着调用SparkDeployScheduleBackend的reviveOffers方法,经过一系列调用到makeOffers方法。
- makeOffers方法中的Scheduler.resourceOffers方法会调用TaskScheduleImpl的resourceOffers方法,执行任务分配算法,将各个task分配到Executor上去。
- makeOffers方法中的launchTasks方法接收已经分配完成的tasks列表,并为每个task发送LaunchTask消息到对应的Executor上去,由Executor启动并执行task。
下一篇我们将剖析Executor接收到LaunchTask消息后会如何一步步启动Task。
Spark源码剖析(九):TaskScheduler原理与源码剖析的更多相关文章
- 2,MapReduce原理及源码解读
MapReduce原理及源码解读 目录 MapReduce原理及源码解读 一.分片 灵魂拷问:为什么要分片? 1.1 对谁分片 1.2 长度是否为0 1.3 是否可以分片 1.4 分片的大小 1.5 ...
- Spark源码剖析(七):Job触发流程原理与源码剖析
引言 我们知道在application中每存在一个action操作就会触发一个job,那么spark底层是怎样触发job的呢?接下来我们用一个wordcount程序来剖析一下job的触发机制. 解析w ...
- [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...
- Spark源码剖析(八):stage划分原理与源码剖析
引言 对于Spark开发人员来说,了解stage的划分算法可以让你知道自己编写的spark application被划分为几个job,每个job被划分为几个stage,每个stage包括了你的哪些代码 ...
- spark 源码分析之四 -- TaskScheduler的创建和启动过程
在 spark 源码分析之二 -- SparkContext 的初始化过程 中,第 14 步 和 16 步分别描述了 TaskScheduler的 初始化 和 启动过程. 话分两头,先说 TaskSc ...
- spark 源码分析之六--Spark RPC剖析之Dispatcher和Inbox、Outbox剖析
在上篇 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRPCEnv 中,涉及到了Diapatcher 内容,未做过多的剖析.本篇来剖析一下它的工作原理. Dispatc ...
- spark 源码分析之十--Spark RPC剖析之TransportResponseHandler、TransportRequestHandler和TransportChannelHandler剖析
spark 源码分析之十--Spark RPC剖析之TransportResponseHandler.TransportRequestHandler和TransportChannelHandler剖析 ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...
随机推荐
- Scala入门系列(十二):隐式转换
引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...
- Web离线应用解决方案——ServiceWorker
什么是ServiceWorker 在介绍ServiceWorker之前,我们先来谈谈PWA.PWA (Progressive Web Apps) 是一种 Web App 新模型,并不是具体指某一种前沿 ...
- Python爬虫(十二)_XPath与lxml类库
Python学习指南 有同学说,我正则用的不好,处理HTML文档很累,有没有其他的方法? 有!那就是XPath,我们可以用先将HTML文档转换成XML文档,然后用XPath查找HTML节点或元素. 什 ...
- Spring之AOP实现面向切面编程
近期在学Java的动态代理和Spring面向切面编程,越来越认为Spring设计的真的是太完美了.于是,想一个最简单的样例来跑一下.但问题多多,显示缺少,Aspectj里面的相应的类.导入Aspect ...
- 基于MATLAB边缘检测算子的实现
基于MATLAB边缘检测算子的实现 作者:lee神 1. 概述 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点.图像属性中的显著变化通常反映了属性的重要 ...
- Winform开发框架中工作流模块之审批会签操作(2)
前面随笔介绍了请假申请单和报销申请单两个不同的业务表单的流程处理,一个是单表信息,一个包含明细的主从表信息,后者包含了条件流程的处理,在流程审批中,一般还有一种流程处理就是会签的操作,会签处理是几个审 ...
- springboot(十三):springboot小技巧
一些springboot小技巧.小知识点 初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用Jpa,另外一种是Spring JDBC.两种方式各有区别下面 ...
- 开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面
NanUI是什么 NanUI基于ChromiumFX项目进行开发,它能让你在你的Winform应用程序中使用HTML5/CSS3/Javascript等网页技术来呈现用户界面(类似Electron). ...
- spark-submit参数说明--standalone
示例: spark-submit [--option value] <application jar> [application arguments] 参数名称 含义 --master M ...
- ed命令