RDD,分散式資料集,是Spark中最基本的資料抽象。
一、什麼是RDD
RDD(Resilient Distributed Dataset)叫做分散式資料集,是 Spark 中最基本的資料抽象。
程式碼中是一個抽象類,它代表一個不可變、可分割槽、裡面的元素可平行計算的集合。
二、RDD的屬性
① 一組分割槽(Partition),即資料集的基本組成單位;
② 一個計算每個分割槽的函式;
③ RDD 之間的依賴關係;
④ 一個 Partitioner,即RDD的分片函式;
⑤ 一個列表,儲存存取每個 Partition 的優先位置(preferred location)
三、RDD的特點
RDD 表示只讀的分割槽的資料集,對RDD進行改動,只能透過 RDD 轉換操作,由一個RDD得到一個新的RDD,新的RDD包含了從其他RDD衍生所必需的資訊。
RDDs 之間存在依賴,RDD的執行是按照血緣關係延時計算的。如果血緣關係較長,可以透過持久化 RDD 來切斷血緣關係。
(1)分割槽
RDD 邏輯上是分割槽的,每個分割槽的資料是抽象存在的,計算的時候會透過一個 compute 函式得到每個分割槽的資料。
如果RDD是透過已有的檔案系統建立,則 compute 函式是讀取指定檔案系統中的資料,如果 RDD 是透過其他 RDD轉換而來,則 compute 函式是執行轉換邏輯將其他 RDD 的資料進行轉換。
(2)只讀
RDD 是隻讀的,要想改變RDD中的資料,只能在現有的RDD基礎上建立新的RDD。
由一個 RDD 轉換到另一個 RDD,可以透過豐富的操作運算元實現,不再像 MapReduce 那樣只能寫 map 和 reduce
RDD 的操作運算元包括兩類:
一類叫做transformations,它是用來將 RDD 進行轉化,構建 RDD 的血緣關係;
另一類叫做 actions,它是用來觸發 RDD 的計算,得到 RDD 的相關計算結果或者將 RDD 儲存到檔案系統中。
(3)依賴
RDDs 透過操作運算元進行轉換,轉換得到的新 RDD 包含了 從其他 RDDs 衍生所必需的資訊,RDDs 之間維護著這種血緣關係,也稱之為依賴。
依賴包括兩種:
一種是窄依賴,RDDs 之間分割槽是一一對應的,
另一種是寬依賴,下游的RDD的每個分割槽與上游RDD(也稱之為父RDD)的每個分割槽都有關,是多對多關係。
(4)快取
如果在應用程式中多次使用同一個 RDD,可以將該RDD快取起來,該RDD只有在第一次計算的時候會根據血緣關係得到的分割槽的資料,在後續其他地方用到該RDD的時候,會直接從快取處而不用再根據血緣關係計算,這樣就加速後期的重用。
(5)checkpoint
雖然 RDD 的血緣關係天然地可以實現容錯,當 RDD 的某個分割槽資料失敗或丟失,可以透過血緣關係重建。但是對於長時間迭代型應用來說,隨著迭代的進行,RDDs 之間的血緣關係會越來越長,一旦在後續迭代過程中出錯,則需要透過非常長的血緣關係去重建,勢必影響效能。為此,RDD 支援 checkpoint 將資料儲存到持久化的儲存中,這樣就可以切斷之前的血緣關係,因為 checkpoint 後的RDD不需要知道它的父 RDDs了,它可以從 checkpoint 處 拿到資料。
— 要養成終身學習的習慣 —