上1篇我們介紹了代表RDD組成的(Dependency、Partition、Partitioner)之1的Partition,這篇接著介紹Dependency。Partition記錄的是數據split的邏輯,Dependency記錄的是transformation操作進程中Partition的演變,即這個Partition從哪來到哪去的進程。
我的另外一篇博客Spark RDD中介紹了RDD的組成,及Dependency的分類和緣由,這里不再累述,先看下Dependency的定義:
Dependency是抽象類,有1個抽象方法rdd,Dependency其實就是父RDD的包裝,其主要子類實現有兩大類:
Dependency分為兩大類,寬依賴和窄依賴,窄依賴有兩個主要實現。
以Wordcount為例
val wordcount = sc.parallelize(List("a c", "a b")) wordcount.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect()
通過web UI查看DAG,以下:
可以看出,其根據shuffle的位置劃分為兩個stage,stage0和stage1
調用toDebugString查看各RDD之間關系
最后,總結出Wordcount中RDD及其對應的Dependency以下,其中方形代表RDD,圓角矩形代表Partition(3個圓角矩形是為了作圖方便,不代表其具體有3個Partition),文本框內第1行動代碼片斷,第2行是對應的RDD,第3行動RDD的Dependency類型
Dependency是RDD的重要組成,分為寬依賴和窄依賴兩大類,實質就是其父RDD的包裝,由Dependency組成的關系構成了lineage的物理結構,也是DAG的物理結構,寬依賴(即shuffle操作)也是stage劃分的根據,窄依賴可以履行流水線(pipeline)操作,效力高。