窄依赖指的是子 RDD 的一个分区只依赖于某个父 RDD 中的一个分区。
宽依赖指的是子 RDD 的每一个分区都依赖于某个父 RDD 中一个以上的分区。
理解宽、窄依赖的区别,需要先了解父 RDD(Parent RDD)和子RDD(Child RDD),map0、filter()方法上方箭头左边的
RDD 是父 RDD,而右边的 RDD是子 RDDunion()方法上方箭头左边的两个 RDD 均为右边 RDD的父 RDD,因此,union()方
法是有两个父 RDD 的。
Spark 中还有一个重要的概念,即 Stage(阶段 )。一般而言,一个作业会被划分成一定数量的 Stage,各个 Stage 之间按
照顺序执行。在 Spark 中,一个作业会被拆分成多组任务每组任务即一个 Stage。而在 Spark中有两类任务,分别是
ShuffleMapTask 和 ResultTaskShumleMapTask 的输出是 Shufle 所需的数据,ResultTask 的输出则是最终的结果。因
此Stage 是以任务的类型为依据进行划分的,Shufe 之前的所有操作属于一个 Stage,Shutil之后的操作则属于另一个
Stage。例如,“rdd.parallize(1 to 10).foreach(println)”这个操作并没有 Shufle,直接就输出了,说明任务只有一个,
即 ResultTask,Stage 也只有一个。如果是“rdd.map(x=>(x,1)).reduceByKey(_+_).foreach (println)”,因为有
reduceByKey()方法所以有一个 Shume 过程,那么 reduceByKeyO)方法之前属于一个 Stage,执行的任务类型为
shufleMapTask,而reduceByKey0)方法及最后的 foreachO)方法属于一个 Stage,直接输出结果。如果一个作业中有多
个 Shuffle 过程,那么每个 Shuffle 过程之前都属于一个 Stage。
将某一个作业划分成多个 Stage,有3个 Stage,分别是 Stage(RDDA)、Stage2(RDDC、RDDD、RDDE、RDDF )、Stage3
(包含所有 RDD)。Spark会将每一个作业分为多个不同的 Stage,而 Stage 之间的依赖关系则形成了有向无环图。Spark遇
到宽依赖则划分一个 Stage,遇到窄依赖则将这个 RDD 的操作加入该 Stage 中,由于宽依赖通常意味着 Shume 操作,因
此 Spark 会将 Shufe 操作定义为划分 Stage 的边界。因此,RDDC、RDDD、RDDE、RDDF 被构建在一个 Stage 中,
RDDA 被构建在一个单独的Stage中,而RDDB和RDDG又被构建在同一个Stage中。