天天看點

Spark之【RDD程式設計】詳細講解(No5)——《RDD依賴關系》

        本篇部落格是Spark之【RDD程式設計】系列第五篇,為大家介紹的是​RDD依賴關系​。

        ​該系列内容十分豐富,高能預警,先贊後看!​

Spark之【RDD程式設計】詳細講解(No5)——《RDD依賴關系》

文章目錄

  • ​​6.RDD依賴關系​​
  • ​​6.1 Lineage​​
  • ​​6.2 窄依賴​​
  • ​​6.3 寬依賴​​
  • ​​6.4 DAG​​
  • ​​6.5任務劃分(面試重點)​​

6.RDD依賴關系

6.1 Lineage

        RDD隻支援粗粒度轉換,即在大量記錄上執行的單個操作。将建立RDD的一系列Lineage(血統)記錄下來,以便恢複丢失的分區。RDD的Lineage會記錄RDD的中繼資料資訊和轉換行為,當該RDD的部分分區資料丢失時,它可以根據這些資訊來重新運算和恢複丢失的資料分區。

Spark之【RDD程式設計】詳細講解(No5)——《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 <console>:24      

2)統計每一種key對應的個數

scala> val wordAndCount = wordAndOne.reduceByKey(_+_)
wordAndCount: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[23] at reduceByKey at <console>:26      

3)檢視“wordAndOne”的Lineage

scala> wordAndOne.toDebugString
res5: String =
(2) MapPartitionsRDD[22] at map at <console>:24 []
 |  MapPartitionsRDD[21] at flatMap at <console>:24 []
 |  /fruit.tsv MapPartitionsRDD[20] at textFile at <console>:24 []
 |  /fruit.tsv HadoopRDD[19] at textFile at <console>:24 []      

4)檢視“wordAndCount”的Lineage

scala> wordAndCount.toDebugString
res6: String =
(2) ShuffledRDD[23] at reduceByKey at <console>:26 []
 +-(2) MapPartitionsRDD[22] at map at <console>:24 []
    |  MapPartitionsRDD[21] at flatMap at <console>:24 []
    |  /fruit.tsv MapPartitionsRDD[20] at textFile at <console>:24 []
    |  /fruit.tsv HadoopRDD[19] at textFile at <console>: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)。

6.2 窄依賴

        窄依賴指得是每一個父RDD的Partition最多被子RDD的一個Partition使用,窄依賴我們形象的比喻為獨生子女。

Spark之【RDD程式設計】詳細講解(No5)——《RDD依賴關系》

6.3 寬依賴

        寬依賴指的是多個子RDD的Partition會依賴同一個父RDD的Partition,會引起shuffle,總結:寬依賴我們形象的比喻為超生。

Spark之【RDD程式設計】詳細講解(No5)——《RDD依賴關系》

6.4 DAG

        DAG(Directed Acyclic Graph)叫做有向無環圖,原始的RDD通過一系列的轉換就形成了DAG,根據RDD之間的依賴關系的不同将DAG劃分成不同的Stage,對于窄依賴,partition的轉換處理在Stage中完成計算。對于寬依賴,由于有Shuffle的存在,隻能在parent RDD處理完成後,才能開始接下來的計算,是以寬依賴是劃分Stage的依據。

Spark之【RDD程式設計】詳細講解(No5)——《RDD依賴關系》

6.5任務劃分(面試重點)

        RDD任務切分中間分為:Application、Job、Stage和Task。

1)Application:初始化一個SparkContext即生成一個Application

2)Job:一個Action算子就會生成一個Job

3)Stage:根據RDD之間的依賴關系的不同将Job劃分成不同的Stage,​遇到一個寬依賴則劃分一個Stage​。

Spark之【RDD程式設計】詳細講解(No5)——《RDD依賴關系》

4)Task:Stage是一個TaskSet,将Stage劃分的結果發送到不同的Executor執行即為一個Task。

注意: Application -> Job-> Stage-> Task 每一層都是 1對n 的關系。

        本次的分享就到這裡,受益的小夥伴或對大資料技術感興趣的朋友記得點贊關注喲。下一篇部落格将為大家介紹​

​RDD緩存​

​,敬請期待!

繼續閱讀