(1)血缘关系:
通过血缘关系,可以知道一个RDD是如何从父RDD计算过来的
A =map=> B =filter=> C
(2)窄依赖:一个父RDD的partition最多被子RDD中的partition使用一次(一父对应一子),窄依赖无shuffle
(3)宽依赖:
父RDD中的一个partition会被子RDD中的partition使用多次(一父多子)
宽依赖有shuffle,一个shuffle会拆成一个stage,2个shuffle拆成3个stage
以wordcount为例(reduceBykey是宽依赖,把stage拆为2个stage;stage序号从0开始,每个stage最后一个操作的名字作为整个stage的名字 ):
sc.textFile("/in/1.txt").flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).collect
分析:
wordcount例子里,reduceByKey相当于把相同的key分到一个partition上去,然后在partition上做加和,
因为并不是同一个相同key都在一个partition里,可能在不同机器上,所以需要有shuffle过程,reduceByKey在shuffle前本地会做一个预聚合
(4)会引起shuffle的操作
(5)spark中的join是宽依赖还是窄依赖?
co-partitioned 是窄依赖,其他是宽依赖