RDD依赖以及DAG原理
1.RDD的转换
val lines=sc.textFile("/data/words.txt") //①
val count=lines.flatMap(line=>line.split(" ")) //②
.map(word=>(word,1)) //③
.reduceByKey(_+_) //④
count.collect //⑤
(1)首先从 HDFS 中读取文件,产生一个 HadoopRDD,然后进行RDD 转换,转换结果为 MapPartitionsRDD。
lines 实际上是一个MapPartitionsRDD,其父 RDD 是 HadoopRDD。
(2)flatMap 操作将 lines 中的所有行,以空格切分 ,然后返回一个单词列表,以每个单词为元素的列表保存到新的 MapPartitionsRDD。
(3)将第二行生成的 MapPartitionsRDD 再次经过 map 操作将每个单词 word 转化为(word,1)的二元组,返回一个新的 MapPartitionsRDD 包含这些元组。
(4)reduceByKey 操作会生成一个 ShuffledRDD。
(5)collect 动作将提交 Job 开始执行,到此 Application 结束
2.RDD的依赖关系
,根据子 RDD 依赖父 RDD 的分区的不同,将这种关系划分为两种:窄依赖和宽依赖
(1)窄依赖
①定义:
窄依赖指的是每一个父 RDD 的分区最多被子 RDD 的一个分区使用
②map和filter
它们只是将各个分区的数据根据转换的规则进行转化
③union
只是将多个 RDD 合并成一个,父 RDD 的分区不会有任务的变化。
④join
如果每个分区仅仅和已知的、特定的分区进行 join,那么这个依赖关系是窄依赖。
(2)宽依赖
宽依赖指的是多个子 RDD 的分区会依赖同一个父 RDD 的分区。
①join
对于需要父 RDD 的所有分区进行 join 的转换,这类 join 的依赖就是宽依赖了。
②groudByKey
子 RDD 的所有分区会依赖父 RDD 的所有分区,子 RDD 的分区是父 RDD 的所有分区 Shuffle 的结果,因此这两个 RDD 是不能通过一个计算任务来完成的。
(3)窄依赖的实现
①OneToOneDependency:一对一依赖
map、filter 操作。
②RangeDependency:范围依赖
如 union 操作。
union 操作返回 UnionRDD,UnionRDD 是把多个 RDD 合并成一个 RDD。
(4)窄依赖的实现:
ShuffleDependency
(5)宽窄依赖的对比
①宽依赖对应shuffle操作,需要在运行时将同一个父RDD的分区传入到不同的子RDD分区中,不同的分区可能位于不同的节点,就可能