接着上期内核源码(六)的最后,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))

  1. 创建TaskSetManager负责某一个TaskSet任务执行情况的监控和管理
  2. 调用SparkDeployScheduleBackend的reviveOffers方法。

 
  
val manager = createTaskSetManager(taskSet, maxTaskFailures)

 
  
backend.reviveOffers()

 
  
果然在父类CoarseGrainedSchedulerBackend中找到了reviveOffers方法,发送reviveOffers消息给driverActor。

 
  
紧接着我们来看看driverActor线程收到reviveOffers消息后如何处理

 
  
new DriverActor(properties)可以看到DriverActor类是CoarseGrainedSchedulerBackend中的类部类

 
  
可以看到driverActor线程收到reviveOffers消息后调用了makeOffers()方法:

  1. 调用TaskScheduleImpl的resourceOffers方法,执行任务分配算法,将各个task分配到Executor上去。
  2. 分配好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的流程已经全部结束,我们稍作总结:

  1. 当TaskScheduler接收到从DAGScheduler提交过来的TaskSet时,首先给每个TaskSet都创建一个TaskSetManager负责管理和监控该TaskSet
  2. 接着调用SparkDeployScheduleBackend的reviveOffers方法,经过一系列调用到makeOffers方法
  3. makeOffers方法中的Scheduler.resourceOffers方法会调用TaskScheduleImpl的resourceOffers方法,执行任务分配算法,将各个task分配到Executor上去
  4. makeOffers方法中的launchTasks方法接收已经分配完成的tasks列表,并为每个task发送LaunchTask消息到对应的Executor上去,由Executor启动并执行task

  
下一篇我们将剖析Executor接收到LaunchTask消息后会如何一步步启动Task。

Spark源码剖析(九):TaskScheduler原理与源码剖析的更多相关文章

  1. 2,MapReduce原理及源码解读

    MapReduce原理及源码解读 目录 MapReduce原理及源码解读 一.分片 灵魂拷问:为什么要分片? 1.1 对谁分片 1.2 长度是否为0 1.3 是否可以分片 1.4 分片的大小 1.5 ...

  2. Spark源码剖析(七):Job触发流程原理与源码剖析

    引言 我们知道在application中每存在一个action操作就会触发一个job,那么spark底层是怎样触发job的呢?接下来我们用一个wordcount程序来剖析一下job的触发机制. 解析w ...

  3. [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等

    本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...

  4. Spark源码剖析(八):stage划分原理与源码剖析

    引言 对于Spark开发人员来说,了解stage的划分算法可以让你知道自己编写的spark application被划分为几个job,每个job被划分为几个stage,每个stage包括了你的哪些代码 ...

  5. spark 源码分析之四 -- TaskScheduler的创建和启动过程

    在 spark 源码分析之二 -- SparkContext 的初始化过程 中,第 14 步 和 16 步分别描述了 TaskScheduler的 初始化 和 启动过程. 话分两头,先说 TaskSc ...

  6. spark 源码分析之六--Spark RPC剖析之Dispatcher和Inbox、Outbox剖析

    在上篇 spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRPCEnv 中,涉及到了Diapatcher 内容,未做过多的剖析.本篇来剖析一下它的工作原理. Dispatc ...

  7. spark 源码分析之十--Spark RPC剖析之TransportResponseHandler、TransportRequestHandler和TransportChannelHandler剖析

    spark 源码分析之十--Spark RPC剖析之TransportResponseHandler.TransportRequestHandler和TransportChannelHandler剖析 ...

  8. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  9. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

随机推荐

  1. day4、Linux基础题目

    第一题 我想在/data/da 目录下面创建 一个 da.txt 文件 [root@ll ~]# cd /data/oldboyedu -bash: cd: /data/oldboyedu: No s ...

  2. UILabel 的使用

    直接上代码: /* UILabel 使用 */ UILabel *aLable = [[UILabel alloc] initWithFrame:self.window.bounds]; aLable ...

  3. Object-C与Swift混合开发

    Object-C作为Apple的iOS App开发语言服务了很多个年头,2014年Apple推出了新的编程语言Swift.更高效更安全的口号再次吸引了一大批非iOS开发程序猿进入,小编觉得Swift代 ...

  4. 三、Spring Boot 多数据源配置

    下面一个Java类是已经写好的根据配置文件动态创建多dataSource的代码,其原理也很简单,就是读取配置文件,根据配置文件中配置的数据源数量,动态创建dataSource并注册到Spring中. ...

  5. linux系统安全及应用

    小伙伴们让我们一起回顾一下Linux系统安全基础知识吧 1. 系统账号清理 对于公司里刚离职或停职不久的人,处于公司信息安全考虑,给他们的账号给锁定就好了. usermod -L wangqingxi ...

  6. Can't update: no tracked branch No tracked branch configured for branch dev.

    1.git pull 命令出现以下错误 $ git pull There is no tracking information for the current branch. Please speci ...

  7. springMVC上传错误StandardMultipartHttpServletRequest

    异常信息 java.lang.ClassCastException: org.springframework.security.web.servletapi.HttpServlet3RequestFa ...

  8. 其他函数:值为NULL时的默认值NVL,DECODE

    NVL(列,默认数字值),此函数返回值为数值型,非NULL时返回原始值,NULL时返回默认数字值. DECODE:

  9. java并发编程的艺术——第五章总结(Lock锁与队列同步器)

    Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...

  10. Python Web框架(URL/VIEWS/ORM)

    一.路由系统URL1.普通URL对应 url(r'^login/',views.login) 2.正则匹配 url(r'^index-(\d+).html',views.index) url(r'^i ...