接着上期内核源码(六)的最后,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. 《算法》C/C++ 图形处理

    概述 一般图形输出无法就是用循环输出 ,提前构造好图形. 两种方式 ** 模拟法直接输出** ** 二维数组 构造输出** 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEF ...

  2. MongoDB之建立Windows和本地虚拟机的双向连接

    本文主要分享如何将MongoDB数据库在Windows系统和本地虚拟机系统建立双向连接,我们将借助MongoDB的可视化工具Robomongo来实现.首先,应该确保你的Windows系统和本地虚拟机系 ...

  3. java学习笔记之StringBuilder

    StringBuilder总结 StringBuilder概述: StringBuilder是一个线程不安全的类,他在字符串连接方面性能尤其出色 StringBuilder类的构造方法: 1.空参数构 ...

  4. PHP开发中需要注意几点事项,新手少走弯路必备知识

    这篇文章主要介绍了PHP开发需要注意的几点事项总结,非常详细,需要的朋友可以参考下.新手多看看避免走弯路. 1.使用内嵌的HTML代码,而不是PHP的echo语句. 因为PHP是一门嵌入式Web编程语 ...

  5. 腾讯qq等级计算公式面试题

    就三道题大概是: 1. 推算出等级相应的天数 这个还比較简单,公式是:(b=2a+3)   a是等级, b是相应的天数 2. 推算出等级总共的天数 先看下规律 等级a 相应天数b 总天数s 1 5 5 ...

  6. 跟着鬼哥学so改动,二,进行篇

    图/文  听鬼哥说故事 继续上文的内容---------------------------------- 0x1:測试文件的编写 经过上一篇文章的基础学习,如今我们開始进行是用的部分. 既然我们能够 ...

  7. LeetCode(24) Swap Nodes in Pairs

    题目 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1-> ...

  8. .NET Core容器化@Docker

    温馨提示:本文适合动手演练,效果更佳.  1. 引言 我们知道. NET Core最大的特性之一就是跨平台,而对于跨平台,似乎大家印象中就是可以在非Windows系统上部署运行.而至于如何操作,可能就 ...

  9. 自学Zabbix3.8.2-可视化Visualisation-maps网络地图

    自学Zabbix3.8.2-可视化Visualisation-maps网络地图 可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map,通过map可以了解应用的整体状况:服务器是否异常 ...

  10. 自学Zabbix3.8.1.1-可视化Visualisation-Graphs简单图表

    自学Zabbix3.8.1.1-可视化Visualisation-Graphs简单图表 Zabbix提供了一些简单的图表,用于可视化由项目收集的数据. 用户不需要进行配置工作来查看简单的图表.他们是由 ...