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