RDD 依赖关系
-
- 一、 Lineage(血缘)
- 二、 窄依赖
- 三、 宽依赖
- 四、 DAG有向无环图
- 五、 任务划分(面试重点)
一、 Lineage(血缘) RDD 只支持
粗粒度
转换,即在大量记录上执行的单个操作
。将创建 RDD 的一系列Lineage(血统)记录下来,以便恢复丢失的分区。RDD 的 Lineage 会记录 RDD 的元数据信息和转换行为,当该 RDD 的部分分区数据丢失时,它
可以根据这些信息来重新运算和恢复丢失的数据分区
。![Spark|Spark——RDD 依赖关系](https://img.it610.com/image/info8/af021998a9844ea68d037c5a3e8b514c.jpg)
文章图片
(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 依赖关系](https://img.it610.com/image/info8/31cf54329a5d4ee090b19cb5064a6c9a.jpg)
文章图片
三、 宽依赖 宽依赖指的是
多个子 RDD 的 Partition 会依赖同一个父 RDD 的 Partition
,会引起shuffle
。可以把宽依赖形象的比喻为
超生
![Spark|Spark——RDD 依赖关系](https://img.it610.com/image/info8/322ddcee30c14e4f8c6e0fd2f82be4fc.jpg)
文章图片
四、 DAG有向无环图 DAG(Directed Acyclic Graph)叫做
有向无环图
,原始的 RDD 通过一系列的转换就就形成了 DAG,根据 RDD 之间的依赖关系的不同将 DAG 划分成不同的 Stage,对于窄依赖,partition 的转换处理在 Stage 中完成计算。对于宽依赖,由于有 Shuffle 的存在,只能在 parent RDD 处理完成后,才能开始接下来的计算,因此宽依赖是划分 Stage 的依据
。![Spark|Spark——RDD 依赖关系](https://img.it610.com/image/info8/fa538e5324a64dd9948bf980aa4c5f87.jpg)
文章图片
五、 任务划分(面试重点) 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 依赖关系](https://img.it610.com/image/info8/40d3b4d9b27f4cc79efbf877de17d715.jpg)
文章图片
推荐阅读
- 大数据相关框架|Hadoop生态圈之即席查询工具Kylin
- spark|spark学习笔记四(spark集群搭建)
- 大数据|大数据计算框架与平台--深入浅出分析
- 【大数据day17】——Hive数据仓库(数据库与数据仓库的区别,Hive 的基本概念, Hive 的安装, Hive 的安装,Hive 的基本操作1)
- #|Spark-RDD的依赖关系
- 大数据|Kylin、druid、presto、impala四种即席查询对比--(转载)
- 大数据|15道经典大数据面试题
- spark|Spark中RDD的依赖关系
- 大数据|大数据面试题汇总