Spark——RDD 依赖关系

一、 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.toDebugString

res5: 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.toDebugString

res6: 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.dependencies

res7: Seq[org.apache.spark.Dependency[_]] =
List(org.apache.spark.OneToOneDependency@5d5db92b)

(6)查看“wordAndCount”的依赖类型

scala> wordAndCount.dependencies

res8: 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的运行规划图:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值