大话Spark(9)-源码之TaskScheduler

上篇文章讲到DAGScheduler会把job划分为多个Stage,每个Stage中都会创建一批Task,然后把Task封装为TaskSet提交到TaskScheduler。
这里我们来一起看下TaskScheduler是如何把Task分配到应用程序的Executor上去执行。
重点是这里的task分配算法。

如下图是DagScheduler中把TaskSet提交到TaskScheduler:
这里我们以standalone模式为例,使用的是TaskSchedulerImpl,实现与TaskSchduler这个trait

?

TaskSchedulerImple的submitTasks方法如下:
首先它会为每个taskSet创建一个TaskManager,TaskManager负责管理这个TaskSet(负责Task的重试,处理TaskSet的本地话调度机制等)。

?

上图中重要的方法是backend.reviveOffers(),这里的backend是初始化SparkContext的时候根据clusterManager的不同创建的backend(这里是 StandaloneSchedulerBackend extends CoarseGrainedSchedulerBackend),backend底层负责底层接受TaskSchedulerImpl的控制,负责Master的注册和Tasks发送到Executor等操作。

backend.reviveOffers()调用到CoarseGrainedSchedulerBackend的内部类DriverEndpoint的makeOffers, 如下:

?

makeOffers方法的主要作用是取出所有可用的executor并且计算其可用的资源数量,然后调用resourceOffers把task分配到executor,以下是resourceOffers中的部分代码:

?

按照我们的调度顺序获取每个TaskSet, 然后级别的递增顺序遍历本地化级别, 尝试使用最小的本地化级别启动task

?

本地化级别:
1 PROCESS_LOCAL:进程本地化,rdd对应的分区数据和task在一个executor中,速度最快
2 NODE_LOCAL: 节点本地化,rdd和task不在一个executor中,但是在一个worker上
3 NO_PREF: 无所谓本地化级别
4 RACK_LOCAL:机架本地化, rdd和task在一个机架上。
5 ANY: 任意的本地化级别。
启动任务的时候从最小的本地化级别开始尝试,也就是尽量选择最快的计算方式。

再看一下上图中,内层for循环中的resourceOfferSingleTaskSet方法:

?

以上就是TaskScheduler执行task分配算法的大致过程,感谢阅读。

原文地址:https://www.cnblogs.com/wangtcc/p/da-huaSpark-9yuan-ma-zhiTaskScheduler.html

时间: 2024-09-29 12:47:49

大话Spark(9)-源码之TaskScheduler的相关文章

spark core源码分析6 Spark job的提交

本节主要讲解SparkContext的逻辑 首先看一个spark自带的最简单的例子: object SparkPi { def main(args: Array[String]) { val conf = new SparkConf().setAppName("Spark Pi") val spark = new SparkContext(conf) val slices = if (args.length > 0) args(0).toInt else 2 val n = ma

(升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课程会涵盖Scala编程详解.Spark核心编程.Spark SQL和Spark Streaming.Spark内核以及源码剖析.性能调优.企业级案例实战等部分.完全从零起步,让学员可以一站式精通Spark企业级大数据开发,提升自己的职场竞争力,实现更好的升职或者跳槽,或者从j2ee等传统软件开发工程

Spark SQL源码分析之核心流程

自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人到了几十人,而且发展速度异常迅猛,究其原因,个人认为有以下2点: 1.整合:将SQL类型的查询语言整合到 Spark 的核心RDD概念里.这样可以应用于多种任务,流处理,批处理,包括机器学习里都可以引入Sql. 2.效率:因为Shark受到hive的编程模型限制,无法再继续优化来适应Spark模型里. 前一段时间测试过Shark,并且对Spark

Spark 定制版:009~Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

本讲内容: a. Receiver启动的方式设想 b. Receiver启动源码彻底分析 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上一讲中,我们给大家具体分析了RDD的物理生成和逻辑生成过程,彻底明白DStream和RDD之间的关系,及其内部其他有关类的具体依赖等信息: a. DStream是RDD的模板,其内部generatedRDDs 保存了每个BatchDuration时间生成的RDD对象实例.DStream的依赖构成了RDD

Spark SQL 源码分析之 In-Memory Columnar Storage 之 cache table

/** Spark SQL源码分析系列文章*/ Spark SQL 可以将数据缓存到内存中,我们可以见到的通过调用cache table tableName即可将一张表缓存到内存中,来极大的提高查询效率. 这就涉及到内存中的数据的存储形式,我们知道基于关系型的数据可以存储为基于行存储结构 或 者基于列存储结构,或者基于行和列的混合存储,即Row Based Storage.Column Based Storage. PAX Storage. Spark SQL 的内存数据是如何组织的? Spar

Spark SQL 源码分析之 In-Memory Columnar Storage 之 in-memory query

/** Spark SQL源码分析系列文章*/ 前面讲到了Spark SQL In-Memory Columnar Storage的存储结构是基于列存储的. 那么基于以上存储结构,我们查询cache在jvm内的数据又是如何查询的,本文将揭示查询In-Memory Data的方式. 一.引子 本例使用hive console里查询cache后的src表. select value from src 当我们将src表cache到了内存后,再次查询src,可以通过analyzed执行计划来观察内部调用

spark.mllib源码阅读-分类算法4-DecisionTree

本篇博文主要围绕Spark上的决策树来讲解,我将分为2部分来阐述这一块的知识.第一部分会介绍一些决策树的基本概念.Spark下决策树的表示与存储.结点分类信息的存储.结点的特征选择与分类:第二部分通过一个Spark自带的示例来看看Spark的决策树的训练算法.另外,将本篇与上一篇博文"spark.mllib源码阅读bagging方法"的bagging子样本集抽样方法结合,也就理解了Spark下的决策森林树的实现过程. 第一部分: 决策树模型 分类决策树模型是一种描述对实例进行分类的树形

第一篇:Spark SQL源码分析之核心流程

/** Spark SQL源码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几人到了几十人,而且发展速度异常迅猛,究其原因,个人认为有以下2点: 1.整合:将SQL类型的查询语言整合到 Spark 的核心RDD概念里.这样可以应用于多种任务,流处理,批处理,包括机器学习里都可以引入Sql.    2.效率:因为Shark受到hive的编程模型限制,无法再继续优化来适应Spark

【Spark SQL 源码分析系列文章】

从决定写Spark SQL源码分析的文章,到现在一个月的时间里,陆陆续续差不多快完成了,这里也做一个整合和索引,方便大家阅读,这里给出阅读顺序 :) 第一篇 Spark SQL源码分析之核心流程 第二篇 Spark SQL Catalyst源码分析之SqlParser 第三篇 Spark SQL Catalyst源码分析之Analyzer 第四篇 Spark SQL Catalyst源码分析之TreeNode Library 第五篇 Spark SQL Catalyst源码分析之Optimize