本文讲述了Spark任务调度的实现框架,概要分析了Spark从Job提交到Task创建并提交给Worker的整个过程。并对Spark任务调度相关的概念进行了介绍。

任务调度总体流程

从设计层面来说,Spark把任务的执行过程划分成多个阶段,每个阶段由一个处理对象来进行处理,并把处理完成的结果传递个下一个处理对象进行处理。

这个过程如下图1所示:

图1 任务调度总体流程抽象

我们知道RDD是懒加载,一般来说Spark RDD的转换函数(transformation)不会执行任何动作,而当Spark在执行RDD的Action函数时,Spark调度器(Scheduler)会根据RDD的依赖关系构建执行的DAG图并提交一个Spark作业(Job)。

Job由很多的Stage构成,这些Stage是在转换中实现最终RDD所需数据的步骤。每个Stage由一组在执行器(executor)上并行计算的任务(task)构成。

图1从概念上,展示了Job->Stage->Task->TaskRunner线程的创建过程:

1)通过SparkContext或SparkSession来执行应用程序。

2)在Spark应用程序中,每个Action操作都会生成并提交一个Job。该动作是由SparkContext中的runJob系列函数来完成的。

3)在Job会根据是否存在宽转换(也就是:是否存在shuffle依赖)为标准来创建Stage。创建Stage的动作是由DAGScheduler来完成的(后面的文章会详细分析创建Stage的过程)。

4)Stage会创建出一系列的Task,这些Task由TaskScheduler提交到各个执行器(Executor)中 。

5)Executor会为每个Task启动一个TaskRunner线程来执行。

任务调度实现框架

前面从抽象概念上分析了任务执行的全过程,下面从实现层面来分析任务调度的全流程。

从实现层面来讲,Spark任务调度的整个过程如下图所示:

图2 任务调度实现流程

1)DAG图的构建

用户编写Spark应用程序,该应用程序可能包括一个或多个RDD的操作。在《RDD转换操作原理》一节分析过,RDD的每个转换操作(Transformations操作)会形成一个新的RDD,多个RDD之间会形成依赖关系,这就是RDD的DAG。可以参考"RDD依赖的实现原理"和"RDD的血缘(Lineage)"章节。

2)Stage的划分和提交

Spark会把DAG交给一个后台服务:DAGScheduler。它会根据DAG中RDD的相互依赖关系,按是否为shuffle依赖(宽依赖)为边界,来划分Stage(后面会有专门的文章分析如何划分Stage)。一个DAG可能被划分成一个或多个Stage,多个Stage也是相互依赖的,Stage的依赖也是一个DAG图。

3)创建Task和TaskSet,并传给TaskScheduler

DAGScheduler会根据需要计算的分区列表和Stage的类型,来为每个分区创建一个Task,然后为该每个Stage创建一个TaskSet,并把该TaskSet传递给对应运行模式的TaskScheduler对象(不同运行模式,TaskScheduler实现类不同)。

4)Task的提交和执行

TaskScheduler对象接收到TaskSet后,会检查Executor端是否有足够的资源来执行本次提交的TaskSet,检查时会考虑资源调度的算法,目前有两种资源调度算法:FIFO(先进先出调度)和FAIR(公平调度),默认是FIFO。若资源足够,则会根据SchedulerBackend后台的DriverEndpoint(RPC环境)来向Worker端对应的Executor来发送LaunchTask(TaskDescription)消息来执行任务。

其实消息不是直接传递给Executor的,而是每个Executor都对应一个后台服务:CoarseGrainedExecutorBackend,消息是由该后台服务接收,并传递Executor对象的函数,此时Executor就可以开始创建TaskRunner线程,向任务线程池中提交了。

至此,任务线程正式启动了。Executor会把任务执行的状态,通过CoarseGrainedExecutorBackend传递给SchedulerBackend后台,这样Driver端就能实时得知每个Executor的任务执行状态了。

任务提交的这个过程如下图3所示:

图3 Task提交过程

任务调度的基本概念

DAG(Direct Acyclic Graph)

在Spark任务调度的较高层面,Spark会根据RDD的依赖关系,以Shuffle依赖为边界来划来划分出一个个的相互依赖的Stage,这些Stage构成了一个有向无环图(DAG)。

DAGScheduler

DAGScheduler实现面向阶段(Stage)的高层次的调度。 它为每个Job计算出一个由Stage组成的DAG,跟踪RDD和Stage的输出,并找到运行Job的最小执行计划。

然后,它将阶段(Stage)创建为TaskSet传给TaskScheduler,再交由TaskScheduler来处理TaskSet。

ActiveJob

每个Action操作(比如:count())都会触发一个Job的提交。Job由ActiveJob类来表示。

从逻辑上划分有两种Job,一种是触发Action后用来计算结果。一种是,map阶段的Job,用来计算map端的输出数据。每个Job可以被划分成多个Stage。

Stages

Spark的DAGScheduler把一个Job划分成多个相互依赖的Stage。它会以RDD的Shuffle依赖为边界来进行Stage的划分。也就是说,在遍历RDD的依赖关系时,只要遇到Shuffle依赖就会创建一个新的Stage,这样同一个Stage中的依赖都是窄依赖,所以同一个Stage中的任务可以通过pipeline方式执行。 有两种类型的Stage:

  • ResultStage:用来计算触发的Action操作的结果;
  • ShuffleMapStage:是执行DAG的中间阶段,主要是为shuffle产生数据。它们会在每次shuffle操作之前执行,可能会包括多个pipeline操作。

TaskSet

TaskSet是Task的集合。进一步来说,Spark会通过DAGScheduler为每个Stage生成一个TaskSet。所以,一个TaskSet是一个Stage的所有Task的集合。

TaskSet会传给TaskScheduler,由TaskScheduler来进一步处理。

Task

每个TaskSet由一组Task组成。Task是Spark任务执行层次的最小执行单元,在Executor端每个单元对应一个执行线程。一个TaskSet中的Task,会在不同的分区数据上执行,但一个Task不能在多个Executor上执行。

但是,每个执行器(executor)都有一个动态分配器的资源数用来运行任务,并且可以在其生命周期内并发运行多个任务。

Spark会为每个分区创建一个Task,所以,每个Stage的Task数,对应于该Stage的输出RDD的分区数。

Taskscheduler

任务(Task)调度器,它接收从DAGScheduler传过来的每个阶段(Stage)的任务集(TaskSet),并负责将任务发送到Worker去执行,若Task运行失败则进行重试。

实现层面,Spark定义了一个org.apache.spark.scheduler.Taskscheduler的接口,该接口的唯一实现类是org.apache.spark.scheduler.TaskSchedulerImpl。

不同模式的任务调度的实现,需要通过一个调度后台来完成,调度后台需要实现接口:SchedulerBackend。

SchedulerBackend

调度系统的后台服务模块,主要负责向资源管理器申请集群资源。调度器后台服务在SparkContext创建时启动。

不同模式的任务调度后台的实现不同。实现调度后台服务时,都必须实现接口:SchedulerBackend。

调度器后台服务的大部分功能是在父类:CoarseGrainedSchedulerBackend中完成的,比如:向Executor端发起执行Task的指令等。不同模式的任务调度后台其实是继承了和复用了CoarseGrainedSchedulerBackend类中的功能实现。

调度后台的实现后面会有文章专门进行分析。

CoarseGrainedExecutorBackend

Executor端的后台服务,每个Executor都对应一个CoarseGrainedExecutorBackend后台服务。该后台服务用来启动和控制Executor,它和Driver端的SchedulerBackend后台通信,接收并处理来自Driver端SchedulerBackend的命令。例如:当有一个Task集合需要执行时,Driver端的SchedulerBackend发送给该服务模块的命令是:LaunchTask。此时,CoarseGrainedExecutorBackend会检查Executor是否已经启动,若已经启动,则会启动线程池来执行提交的Task。

另外,该后台服务把Executor的状态信息汇报给Driver端。所以,CoarseGrainedExecutorBackend就像是一个Executor的代理服务。

总结

本文介绍了Spark任务调度框架的基本概念,并对任务调度框架中的各个成员进行了简要的说明。后续的文章将详细分析Spark任务调度框架中的各个部分的具体实现原理。

spark的数三角形算法_Spark任务调度概述相关推荐

  1. spark的数三角形算法_spark graphx 图计算

    写在前面 态度决定高度!让优秀成为一种习惯! 世界上没有什么事儿是加一次班解决不了的,如果有,就加两次!(- - -茂强) 什么是一个图 一个网络 Network 一个树 Tree 一个RDBMS R ...

  2. spark的数三角形算法_数据算法 Hadoop Spark大数据处理技巧 PDF 下载

    相关截图: 资料简介: 本书介绍了很多基本设计模式.优化技术和数据挖掘及机器学习解决方案,以解决生物信息学.基因组学.统计和社交网络分析等领域的很多问题.这本书还概要介绍了MapReduce.Hado ...

  3. Spark任务调度概述_大数据培训

    Spark 任务调度机制 在工厂环境下,Spark集群的部署方式一般为YARN-Cluster模式,之后的内核分析内容中我们默认集群的部署方式为YARN-Cluster模式.在上一章中我们讲解了Spa ...

  4. Spark中常用的算法

    Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要 ...

  5. 大数据开发超高频面试题!大厂面试必看!包含Hadoop、zookeeper、Hive、flume、kafka、Hbase、flink、spark、数仓等

    大数据开发面试题 包含Hadoop.zookeeper.Hive.flume.kafka.Hbase.flink.spark.数仓等高频面试题. 数据来自原博主爬虫获取! 文章目录 大数据开发面试题 ...

  6. Java开发 三角形算法汇总

    Java开发 三角形算法汇总 文章简介 直角三角形算法 取边长 任意三角形 求边长 求夹角 文章简介 本文汇总一下三角形算法,包含 求边长.求角度等常用函数 直角三角形算法 取边长 勾股定理,是一个基 ...

  7. 计蒜客NOIP模拟赛 数三角形

    数三角形 题目描述 刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张 ...

  8. EM算法(期望最大化算法)理论概述

    1.EM算法 1.1概述 EM(Expectation-Maximum)算法也称期望最大化算法,曾入选"数据挖掘十大算法"中,可见EM算法在机器学习.数据挖掘中的影响力.EM算法是 ...

  9. 4.2 路由算法与路由协议概述

    4.2 路由算法与路由协议概述

最新文章

  1. Mysql依赖库Boost的源码安装,linux下boost库的安装
  2. 进击的python【第一集】
  3. mybatis关联查询
  4. JVM详解之:java class文件的密码本
  5. 【渝粤题库】国家开放大学2021春3979会计学概论题目
  6. python 参数个数 同名函数_Python——函数的参数
  7. 团购“罗生门”渐退行业舞台 千团大战仍需企业自律
  8. 插入图像标签(HTML)
  9. 2020成人高考计算机基础知识题库,2020年成人高考计算机基础考试模拟题
  10. Ubuntu18.04安装cmake(附免费下载cmake)。
  11. 最新Erphpdown v13.11modown8.02主题破jie版去授权无域名限制版本
  12. DSP之ICETEK-DM6437-B开发
  13. UML用例图之寻找参与者与用例
  14. java assert 断言_Java 之 assert (断言)
  15. 巡检设备RFID技术应用浅析
  16. Android补间动画之透明度动画
  17. uniapp开发微信公众号(h5)项目如何引入微信jssdk,分享,扫一扫
  18. 中国最美的一千个汉字 : 千字文5
  19. 在广告文案中的最有诱惑力的十个词
  20. OPPOR9Plus系列通刷刷机包精简包_OPPOR9Plus线刷包救砖包_OPPOR9Plus纯净刷机包_OPPOR9Plus刷机教程下载

热门文章

  1. 大讲堂专访丨连接Oracle DBA与开发的桥梁:Oracle的redo与undo
  2. 记一次 Redis Cluster 宕机引发的事故
  3. 快来一起玩转LiteOS组件:Curl
  4. Git:改变世界的一次代码提交
  5. 实战分享丨MySQL 与Django版本匹配相关经验
  6. New UWP Community Toolkit - ImageEx
  7. 云上自动化 vs 云上编排
  8. sizeof 在C语言的作用,union 与sizeof的作用??
  9. Android笔记 显式意图demo
  10. 创建mysql数据库快照_数据库教程