spark初識二

longmanma發表於2021-09-09

RDD設計背景

  1. RDD被設計用來減少IO出現的,提供了一中抽象的資料結構,不用擔心的底層資料的分散式特性。只需將具體的應用邏輯將一些列轉換進行處理。不同的RDD之間的轉換操作形成依實現管道話。從而避免中間結果落地的儲存。降低資料複製,磁碟IO和序列化開銷。

  2. RDD是一個不可變的分散式物件集合。每個RDD會被分成多個分割槽,這些分割槽執行在叢集的不同節點上。每個分割槽就是一個資料集片段。RDD提供的是一種高度受限的共享記憶體模型,既RDD是隻讀的記錄分割槽的集合,不能直接修改,只能給予文件sing的物理儲存中的資料來建立RDD,或者是從其他RDD操作上執行轉換操作得到新的RDD。

  3. RDD提供了一組豐富的操作,並且支援常見的資料運算,包含兩種,分別為‘’行動‘’和‘’轉換‘’兩種。行動 是用來執行計算並制定輸出的形式。後者指定RDD之間的相互依賴關係。兩類的操作區別是轉換是用來轉換RDD得到新的RDD,行動操作是接收RDD但是返回的就不是RDD了,是值或者其他集合等內容。一般我們都會把行動操作的結果存入到資料儲存結構中,如資料庫hbase.等

  4. RDD的操作流程。一般如下。

  • 透過RDD讀取外部資料庫或者資料來源進行建立。

  • RDD經過一些列操作進行轉換(map,filter),形成新的RDD,提供給下一個RDD進行轉換使用。

  • 最後經過行動操作,進行處理輸入到外部的資料來源中或者成為集合內容。

  1. RDD在操作中是屬於惰性呼叫,只有到達‘’行動‘’這個操作之後,才會開始進行真正的計算。

        SparkConf  conf = new SparkConf().setMaster("local").setAppName("My App Test");
        JavaRDD<String>  pairRDD =  scContext.parallelize(Arrays.asList("a","b","c"));
        pairRDD.foreach(result -> System.out.println(result.toString()));

圖片描述

從資料讀入到行動結束開始運算

RDD特性

  • 為什麼RDD能實現高效計算?

  1. 高效的容錯性。 分散式共享記憶體。鍵值儲存、記憶體資料庫等。為了實現容錯必須在叢集節點進行資料的複製,或者記錄日誌。簡單的說,在這些節點之間會發生大量的資料傳輸,對於資料密集型應用而言會帶來很大的開銷。但是由於RDD在設計中資料至刻度,不可更改,這就造成我們必須進行RDD的轉換,將父RDD轉換成子RDD。這樣從開始到結束建立的RDD就會形成一幅血緣圖.在這些轉換的過程中我們會把中間結果持久化到記憶體,資料再內從中的多個RDD之間進行傳遞,不需要落地到磁碟上,但是內潤空間不足 的時候,我們也可以利用磁碟的效能來進行消耗。物件儲存可以是java物件。避免了不必要的資料序列化和反序列化開銷。

  2. 依賴關係:在RDD中我們會進行一系列的操作如map,filte,Join 等,但是不同的操作會使我們在操作中產生不同的依賴關係,主要分為兩種 款依賴和窄依賴。

  • 寬依賴:表現為一個父RDD的分割槽對應一個子分割槽 形成或者多個父RDD對應一個子RDD的分割槽,是一對一或者多對一的關係。

  • 窄依賴:在這裡就是一個父RDD對應多個子RDD 。


    圖片描述

    圖摘自海牛大資料論壇


    一般我們在操作中,map,filter,union 等操作屬於窄依賴,而groupByKey,sortByKey等屬於寬依賴,但是對於左外連結,又外連結,join連結等操作就需要分兩種情況了。

  1. 假如我們在輸入資料的時候,已經把資料進行了協同劃分,比如我們在資料處理的時候進行的了根據鍵值分割槽,把屬於多個父RDD的其中一個區的key落在了子RDD的一個分割槽裡面,不產生在父RDD的一個分割槽落在子RDD的兩個分割槽的情況。

  2. 對輸入我們進行非協同劃分,這種就屬於寬依賴。

  3. 這兩種區別 : 正如我們上面所說Spark 有高效的容錯性,正式由於這種依賴關係所形成的,透過血緣圖我們可以獲取足夠的資訊來重新進行計算和恢復丟失資料分割槽的資料,提高效能。對於效能而言,窄依賴的失敗恢復比較高效,因為他只需要根據自己的父節點進行資料分割槽恢復即可,但是寬依賴就不行了,需要重新計算過程設計到的父RDD分割槽,效能損耗大。但是Spark還提供了資料檢查節點和記錄日誌,用於持久化資料RDD,減少追尋資料到最開始的RDD中。

  1. 階段進行劃分

  2. Spark在執行過程中,是分析各個階段的RDD形成DAG操作,在透過分析各個RDD之間的依賴關係來決定如何劃分階段。具體的劃分方法是:在DAG之間進行反向解析,從輸出資料到資料庫或者形成集合那個位置開始向上解析,遇到寬依賴就斷開,聚到窄依賴就把當前的RDD加入到當前的階段中。將窄依賴儘量劃分到同一階段中,可以實現流水線的操作。

  3. 總結上面的操作流程就是 :

  • 建立RDD物件

  • SparkContext負責構建RDD之間的依賴關係也就是血緣圖。構建DAG
    -DAGScheduler負責將DAG分解成多個階段。每個階段都包含多個任務,每個任務都會被排程器傳送給工作節點上的Executor執行

圖片描述

執行過程



作者:LuckQI
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2730/viewspace-2818645/,如需轉載,請註明出處,否則將追究法律責任。