窄依赖和宽依赖

窄依赖:

指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子RDD 的分区。图中,map/filter和union属于第一类,对输入进行协同划分(co-partitioned)的join属于第二类。

宽依赖:

指子RDD的分区依赖于父RDD的所有分区,这是因为shuffle类操作,如图中的groupByKey和未经协同划分的join。

Stage

一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage。Stage的划分在RDD的论文中有详细的介绍,简单的说是以shuffle和result这两种类型来划分。在Spark中有两类task,一类是shuffleMapTask,一类是resultTask,第一类task的输出是shuffle所需数据,第二类task的输出是result,stage的划分也以此为依据,shuffle之前的所有变换是一个stage,shuffle之后的操作是另一个stage。比如 rdd.parallize(1 to 10).foreach(println) 这个操作没有shuffle,直接就输出了,那么只有它的task是resultTask,stage也只有一个;如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 这个job因为有reduce,所以有一个shuffle过程,那么reduceByKey之前的是一个stage,执行shuffleMapTask,输出shuffle所需的数据,reduceByKey到最后是一个stage,直接就输出结果了。如果job中有多次shuffle,那么每个shuffle之前都是一个stage.
会根据RDD之间的依赖关系将DAG图划分为不同的阶段,对于窄依赖,由于partition依赖关系的确定性,partition的转换处理就可以在同一个线程里完成,窄依赖就被spark划分到同一个stage中,而对于宽依赖,只能等父RDD shuffle处理完成后,下一个stage才能开始接下来的计算。之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中

Stage划分思路

因此spark划分stage的整体思路是:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中。因此在图2中RDD C,RDD D,RDD E,RDDF被构建在一个stage中,RDD A被构建在一个单独的Stage中,而RDD B和RDD G又被构建在同一个stage中。
  在spark中,Task的类型分为2种:ShuffleMapTask和ResultTask;简单来说,DAG的最后一个阶段会为每个结果的partition生成一个ResultTask,即每个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的!而其余所有阶段都会生成ShuffleMapTask;之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中;也就是说图2中的stage1和stage2相当于mapreduce中的Mapper,而ResultTask所代表的stage3就相当于mapreduce中的reducer。

总结

map,filtre为窄依赖,
groupbykey为款依赖
遇到一个宽依赖就分一个stage

原文链接:https://blog.csdn.net/a1043498776/article/details/54889922

Spark stage如何划分相关推荐

  1. 用实例说明Spark stage划分原理

    注意:此文的stage划分有错,stage的划分是以shuffle操作作为边界的,可以参考<spark大数据处理技术>第四章page rank例子! 参考:http://litaotao. ...

  2. spark中stage的划分与宽依赖/窄依赖(转载+自己理解/整理)

    [1]宽依赖和窄依赖,这是Spark计算引擎划分Stage的根源所在,遇到宽依赖,则划分为多个stage,针对每个Stage,提交一个TaskSet: 上图:一张网上的图: (个人笔记,rdd中有多个 ...

  3. spark stage 划分 源码

    Spark在任务提交后首先会在DAGScheduler中根据任务划分为不同的stage,起点在DAGScheduler的handleJobSubmitted()方法中. private[schedul ...

  4. spark 源码分析之十九 -- DAG的生成和Stage的划分

    上篇文章 spark 源码分析之十八 -- Spark存储体系剖析 重点剖析了 Spark的存储体系.从本篇文章开始,剖析Spark作业的调度和计算体系. 在说DAG之前,先简单说一下RDD. 对RD ...

  5. spark学习-50-Spark的stage的划分

    1.概述 1.stage的划分主要依据窄依赖和宽依赖 窄依赖: 指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子R ...

  6. Spark作业调度中stage的划分

    目录 (1)Spark作业调度 (2)RDD依赖关系 (3)Stage的划分 Spark在接收到提交的作业后,会进行RDD依赖分析并划分成多个stage,以stage为单位生成taskset并提交调度 ...

  7. Spark的Stage任务划分

    首先了解几个阶段 Spark集群 一个spark集群可以并发运行多个spark应用. Spark应用 一个spark应用由一个driver(写逻辑代码)和多个executor线程组成.spark程序在 ...

  8. Spark源码分析之DAGScheduler以及stage的划分

    一 核心属性 TaskScheduler taskScheduler: task调度器 AtomicInteger nextJobId: 获取下一个jobId Int numTotalJobs:job ...

  9. Spark Stage级调度_大数据培训

    Spark Stage级调度 Spark的任务调度是从DAG切割开始,主要是由DAGScheduler来完成.当遇到一个Action操作后就会触发一个Job的计算,并交给DAGScheduler来提交 ...

最新文章

  1. Ubuntu 将 /home 或 /var 目录挂载到新的分区
  2. Android设计模式系列(2)--SDK源码之观察者模式
  3. SHELL学习 续2
  4. [转载].Freescale.伦德全 - 电路板级的电磁兼容设计
  5. 差动机器人毕业设计_双轮差动机器人曲线算法设计与实现
  6. 云服务器布置_【阿里云ECS】(一)云服务器上安装RStudio-server
  7. golang开发环境配置及Beego框架安装
  8. MyCat分布式数据库集群架构工作笔记0019---高可用_单表存储千万级_海量存储_水平分表
  9. httpClient创建对象、设置超时
  10. oc UIAlertController封装
  11. Java入门系列-15-封装
  12. GBK 与GB2312 互查 区位码
  13. 基于 Flink、ClickHouse 的舆情分析系统:系统架构设计说明书
  14. 小米android11账号补丁,小米9 MIUI11 解账户锁 可登小米账号 永不反锁 完美ROOT 解锁包...
  15. 五胡十六国、东晋南北朝这280年历史,你知道多少?5000字带你看个清楚明白
  16. word交叉引用标题序号 编号变化问题
  17. bam文件读取_把bam文件读入R,并且转为grange对象
  18. 编译原理实验一:词法分析程序设计与实现
  19. vue计算属性与监视属性
  20. shl微型计算机,微型计算机技术-中国大学mooc-题库零氪

热门文章

  1. 成功解决 ValueError: Shape of passed values is (2, 3), indices imply (4, 3)
  2. 【拔刀吧 TensorFlow】TensorFlow学习笔记五
  3. ScriptManager ClientScriptManager
  4. 想要骑驴找马,这些事一定要注意!
  5. Misplaced \noalign. \hline 的解决方法
  6. HDLC、PPP综合实验
  7. 基于Spring 4.0 的 Web Socket 聊天室/游戏服务端简单架构
  8. 优化手机游戏性能,美术相关
  9. 山东移动用明道云赋能一线,打通业务创新最后一公里
  10. 从“三不卖”到三项增长,三翼鸟是如何持续贴近用户的?