Spark|Spark——RDD 依赖关系


RDD 依赖关系

    • 一、 Lineage(血缘)
    • 二、 窄依赖
    • 三、 宽依赖
    • 四、 DAG有向无环图
    • 五、 任务划分(面试重点)

一、 Lineage(血缘) RDD 只支持粗粒度转换,即在大量记录上执行的单个操作。将创建 RDD 的一系列Lineage(血统)记录下来,以便恢复丢失的分区。
RDD 的 Lineage 会记录 RDD 的元数据信息和转换行为,当该 RDD 的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区
Spark|Spark——RDD 依赖关系
文章图片

(1)读取一个 HDFS 文件并将其中内容映射成一个个元组
scala> val wordAndOne = sc.textFile("/fruit.tsv").flatMap(_.split("\t")).map((_,1))wordAndOne: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[22] at map at:24

(2)统计每一种 key 对应的个数
scala> val wordAndCount = wordAndOne.reduceByKey(_+_)wordAndCount: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[23] at reduceByKey at:26

(3)查看“wordAndOne”的 Lineage
scala> wordAndOne.toDebugStringres5: String = (2) MapPartitionsRDD[22] at map at :24 [] | MapPartitionsRDD[21] at flatMap at :24 [] | /fruit.tsv MapPartitionsRDD[20] at textFile at :24 [] | /fruit.tsv HadoopRDD[19] at textFile at :24 []

(4)查看“wordAndCount”的 Lineage
scala> wordAndCount.toDebugStringres6: String = (2) ShuffledRDD[23] at reduceByKey at :26 [] +-(2) MapPartitionsRDD[22] at map at :24 [] | MapPartitionsRDD[21] at flatMap at :24 [] | /fruit.tsv MapPartitionsRDD[20] at textFile at :24 [] | /fruit.tsv HadoopRDD[19] at textFile at :24 []

(5)查看“wordAndOne”的依赖类型
scala> wordAndOne.dependenciesres7: Seq[org.apache.spark.Dependency[_]] = List(org.apache.spark.OneToOneDependency@5d5db92b)

(6)查看“wordAndCount”的依赖类型
scala> wordAndCount.dependenciesres8: Seq[org.apache.spark.Dependency[_]] = List(org.apache.spark.ShuffleDependency@63f3e6a8)

注意:RDD 和它依赖的父 RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)宽依赖(wide dependency)
二、 窄依赖 窄依赖指的是每一个父 RDD 的 Partition 最多被子 RDD 的一个 Partition 使用,可以把窄依赖形象的比喻为独生子女
Spark|Spark——RDD 依赖关系
文章图片

三、 宽依赖 宽依赖指的是多个子 RDD 的 Partition 会依赖同一个父 RDD 的 Partition,会引起shuffle
可以把宽依赖形象的比喻为超生
Spark|Spark——RDD 依赖关系
文章图片

四、 DAG有向无环图 DAG(Directed Acyclic Graph)叫做有向无环图,原始的 RDD 通过一系列的转换就就形成了 DAG,根据 RDD 之间的依赖关系的不同将 DAG 划分成不同的 Stage,对于窄依赖,partition 的转换处理在 Stage 中完成计算。对于宽依赖,由于有 Shuffle 的存在,只能在 parent RDD 处理完成后,才能开始接下来的计算,因此宽依赖是划分 Stage 的依据
Spark|Spark——RDD 依赖关系
文章图片

五、 任务划分(面试重点) RDD 任务切分中间分为:Application、Job、Stage 和 Task
(1)Application:初始化一个 SparkContext 即生成一个 Application
(2)Job:一个 Action算子就会生成一个 Job
(3)Stage:根据 RDD 之间的依赖关系的不同将 Job 划分成不同的 Stage,遇到一个宽依赖则划分一个Stage。
(4)Task:Stage 是一个 TaskSet,将 Stage 划分的结果发送到不同的 Executor 执行即为一个Task。
注意:Application->Job->Stage->Task 每一层都是 1 对 n 的关系。
WordCount的运行规划图:
【Spark|Spark——RDD 依赖关系】Spark|Spark——RDD 依赖关系
文章图片

    推荐阅读