接着上期内核源码(六)的最后,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. slurm-16.05.3任务调度系统部署与测试(1)

      1.概述2.同步节点时间3.下载并解压文件4.编译安装munge-0.5.125.配置munge6.编译安装slurm-16.05.37.配置slurm8.配置MySQL数据库环境9.启动slur ...

  2. js比较日期大小

    第一种方法: var starttime = "2007-1-2 7:30"; var endtime = "2007-2-31 8:30"; alert(Co ...

  3. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  4. centos编译安装php5.6.20+nginx1.8.1+mysql5.6.17

    LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这样的站点服务器架构. 本次实践需求: 实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 xcache ...

  5. Python入门经典 以解决计算问题为导向的Python编程 待完好

    1.4.2:python将代码分为两类:表达式和语句  表达式和语句::  表达式(值和运算符的结合,将产生新值--返回值. 假设在python shell中输入表达式将显示返回值.也就是说,假设x的 ...

  6. Java中用Apache POI生成excel和word文档

    概述: 近期在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能.最后决定用Apache POI来完毕该项功能.本文就项目实现过程中的一些思路与代码与大家共享.同一时候.也作为自 ...

  7. POJ 1861:Network(最小生成树&amp;&amp;kruskal)

    Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13266   Accepted: 5123   Specia ...

  8. 通过第三方工具体验Microsoft Graph

    作者:陈希章 发表于 2017年3月22日 上一篇文章我介绍了如何利用官方提供的Graph 浏览器快速体验Microsoft Graph强大功能,这是极好的起点.官方的Graph浏览器力图用最简单的方 ...

  9. redis的sorted set类型

    1.简单描述 和set类型一样,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score.sorted set的实现是skip list和hash ...

  10. NanUI 0.4.4发布

    NanUI是一个基于ChromiumFX开源项目的.Net Winform界面库,ChromiumFX是Chromium Embedded Framework的.Net实现.众所周知,Chromium ...