intellij idea使用教程 Jetson Nano dedecms 工厂模式 oop variables webpack concurrency swiper vue开发文档 vue社区 android实战项目 jquery拼接字符串 mysql删除一列 安卓程序源代码 pcie转sata input取消边框 nfc卡片 mysql 连接 python环境设置 简单python脚本实例 javasubstring java实现 java获取月份 java中的队列 怪物猎人ol捏脸数据 linux解压tar python输入数字 七宗罪游戏下载 源计划艾克 vue路由跳转 办公室复印机使用方法 苹果手机添加邮箱 pr时间轴 oemdiy 骰子表情包 起义任务线 nginx启动命令 mysql数据库恢复 opengl版本过低
当前位置: 首页 > 学习教程  > 编程语言

大数据-Spark(八)

2020/9/19 14:48:32 文章标签:

                                     大数据-Spark(八)

DAG有向无环图生成

DAG是什么

DAG(Directed Acyclic Graph) 叫做有向无环图(有方向,无闭环,代表着数据的流向),原始的RDD通过一系列的转换就形成了DAG。

下图是基于单词统计逻辑得到的DAG有向无环图:

DAG划分stage

stage是什么

一个Job会被拆分为多组Task,每组任务被称为一个stage。stage表示不同的调度阶段,一个spark job会对应产生很多个stage。stage类型一共有2种:

  • ShuffleMapStage 最后一个shuffle之前的所有变换的Stage叫ShuffleMapStage,它对应的task是shuffleMapTask。
  • ResultStage 最后一个shuffle之后操作的Stage叫ResultStage,它是最后一个Stage。它对应的task是ResultTask。

为什么要划分stage

根据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段)。对于窄依赖,partition的转换处理在一个Stage中完成计算。对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算,由于划分完stage之后,在同一个stage中只有窄依赖,没有宽依赖,可以实现流水线计算,stage中的每一个分区对应一个task,在同一个stage中就有很多可以并行运行的task。

如何划分stage

划分stage的依据就是宽依赖

(1) 首先根据rdd的算子操作顺序生成DAG有向无环图,接下里从最后一个rdd往前推,创建一个新的stage,把该rdd加入到该stage中,它是最后一个stage。

(2) 在往前推的过程中运行遇到了窄依赖就把该rdd加入到本stage中,如果遇到了宽依赖,就从宽依赖切开,那么最后一个stage也就结束了。

(3) 重新创建一个新的stage,按照第二个步骤继续往前推,一直到最开始的rdd,整个划分stage也就结束了。

stage与stage之间的关系

划分完stage之后,每一个stage中有很多可以并行运行的task,后期把每一个stage中的task封装在一个taskSet集合中,最后把一个一个的taskSet集合提交到worker节点上的executor进程中运行。

rdd与rdd之间存在依赖关系,stage与stage之前也存在依赖关系,前面stage中的task先运行,运行完成了再运行后面stage中的task,也就是说后面stage中的task输入数据是前面stage中task的输出结果数据。

spark的任务调度

(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的运行架构

(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上的计算资源得到释放,最后整个任务也就结束了。

基于wordcount程序剖析spark任务的提交、划分、调度流程

此博文仅供学习参考,如有错误欢迎指正。

上一篇《大数据-Spark(七)》

下一篇《大数据-Spark(七)》


本文链接: http://www.dtmao.cc/news_show_200186.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?