李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
09.【转载】Spark RDD任务划分
Leefs
2021-06-29 AM
1127℃
0条
# 09.【转载】Spark RDD任务划分 ### 一、DAG有向无环图生成 ##### 1.1 DAG是什么 **DAG(Directed Acyclic Graph)** 叫做有向无环图(有方向,无闭环,代表着数据的流向),原始的RDD通过一系列的转换就形成了DAG。 下图是基于单词统计逻辑得到的DAG有向无环图 ![09.Spark RDD任务划分01.png](https://lilinchao.com/usr/uploads/2021/06/4076967567.png) ### 二、DAG划分stage ##### 2.1 stage是什么 **一个Job会被拆分为多组Task,每组任务被称为一个stage** stage表示不同的调度阶段,一个spark job会对应产生很多个stage stage类型一共有2种: 1. ShuffleMapStage + 最后一个shuffle之前的所有变换的Stage叫ShuffleMapStage + 它对应的task是shuffleMapTask 2. ResultStage + 最后一个shuffle之后操作的Stage叫ResultStage,它是最后一个Stage + 它对应的task是ResultTask ##### 2.2 为什么要划分stage 根据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段) + 对于窄依赖,partition的转换处理在一个Stage中完成计算 + 对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算,由于划分完stage之后,在同一个stage中只有窄依赖,没有宽依赖,可以实现流水线计算, stage中的每一个分区对应一个task,在同一个stage中就有很多可以并行运行的task。 **2.3 如何划分stage** **划分stage的依据就是宽依赖** 划分流程: (1) 首先根据rdd的算子操作顺序生成DAG有向无环图,接下里从最后一个rdd往前推,创建一个新的stage,把该rdd加入到该stage中,它是最后一个stage。 (2) 在往前推的过程中运行遇到了窄依赖就把该rdd加入到本stage中,如果遇到了宽依赖,就从宽依赖切开,那么最后一个stage也就结束了。 (3) 重新创建一个新的stage,按照第二个步骤继续往前推,一直到最开始的rdd,整个划分stage也就结束了 ![09.Spark RDD任务划分02.png](https://lilinchao.com/usr/uploads/2021/06/2998445243.png) ##### 2.4 stage与stage之间的关系 划分完stage之后,每一个stage中有很多可以并行运行的task,后期把每一个stage中的task封装在一个taskSet集合中,最后把一个一个的taskSet集合提交到worker节点上的executor进程中运行。 rdd与rdd之间存在依赖关系,**stage与stage之前也存在依赖关系,前面stage中的task先运行,运行完成了再运行后面stage中的task**,也就是说后面stage中的task输入数据是前面stage中task的输出结果数据。 ![09.Spark RDD任务划分03.png](https://lilinchao.com/usr/uploads/2021/06/3009318423.png) ### 三、Spark的任务调度 ![09.Spark RDD任务划分04.png](https://lilinchao.com/usr/uploads/2021/06/1946446152.png) ``` (1) Driver端运行客户端的main方法,构建SparkContext对象,在SparkContext对象内部依次构建DAGScheduler和TaskScheduler (2) 按照rdd的一系列操作顺序,来生成DAG有向无环图 (3) DAGScheduler拿到DAG有向无环图之后,按照宽依赖进行stage的划分。每一个stage内部有很多可以并行运行的task,最后封装在一个一个的taskSet集合中,然后把taskSet发送给TaskScheduler (4) TaskScheduler得到taskSet集合之后,依次遍历取出每一个task提交到worker节点上的executor进程中运行。 (5) 所有task运行完成,整个任务也就结束了 ``` ### 四、spark的运行架构 ![09.Spark RDD任务划分05.png](https://lilinchao.com/usr/uploads/2021/06/3193630457.png) ``` (1) Driver端向资源管理器Master发送注册和申请计算资源的请求 (2) Master通知对应的worker节点启动executor进程(计算资源) (3) executor进程向Driver端发送注册并且申请task请求 (4) Driver端运行客户端的main方法,构建SparkContext对象,在SparkContext对象内部依次构建DAGScheduler和TaskScheduler (5) 按照客户端代码洪rdd的一系列操作顺序,生成DAG有向无环图 (6) DAGScheduler拿到DAG有向无环图之后,按照宽依赖进行stage的划分。每一个stage内部有很多可以并行运行的task,最后封装在一个一个的taskSet集合中,然后把taskSet发送给TaskScheduler (7) TaskScheduler得到taskSet集合之后,依次遍历取出每一个task提交到worker节点上的executor进程中运行 (8) 所有task运行完成,Driver端向Master发送注销请求,Master通知Worker关闭executor进程,Worker上的计算资源得到释放,最后整个任务也就结束了。 ``` 附: 原文链接地址:https://www.cnblogs.com/jimmy888/p/13551719.html
标签:
Spark
,
Spark Core
,
Spark RDD
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/1318.html
上一篇
08.Spark RDD依赖关系
下一篇
10.【转载】Spark RDD持久化
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
并发线程
Elastisearch
RSA加解密
Azkaban
ajax
Git
JavaWeb
JavaSE
Nacos
并发编程
SpringCloud
VUE
CentOS
序列化和反序列化
Map
排序
Netty
Java工具类
JavaWEB项目搭建
Hadoop
Beego
MySQL
字符串
Kafka
随笔
查找
BurpSuite
Tomcat
JVM
GET和POST
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞