SparkCore之RDD概述

RDD(Resilient Distributed Dataset)叫做彈性分佈式數據集,是Spark中最基本的數據抽象。代碼中是一個抽象類,它代表一個彈性的、不可變、可分區、裏面的元素可並行計算的集合

RDD的屬性

  1. 一組分區(Partition),即數據集的基本組成單位;
  2. 一個計算每個分區的函數;
  3. RDD之間的依賴關係;
  4. 一個Partitioner,即RDD的分片函數;
  5. 一個列表,存儲存取每個Partition的優先位置(preferred location)。

RDD特點

RDD表示只讀的分區的數據集,對RDD進行改動,只能通過RDD的轉換操作,由一個RDD得到一個新的RDD,新的RDD包含了從其他RDD衍生所必需的信息。RDDs之間存在依賴,RDD的執行是按照血緣關係延時計算的。如果血緣關係較長,可以通過持久化RDD來切斷血緣關係。

(1)彈性
存儲的彈性:內存與磁盤的自動切換;
容錯的彈性:數據丟失可以自動恢復;
計算的彈性:計算出錯重試機制;
分片的彈性:可根據需要重新分片。
(2)分區
RDD邏輯上是分區的,每個分區的數據是抽象存在的,計算的時候會通過一個compute函數得到每個分區的數據。如果RDD是通過已有的文件系統構建,則compute函數是讀取指定文件系統中的數據,如果RDD是通過其他RDD轉換而來,則compute函數是執行轉換邏輯將其他RDD的數據進行轉換。
(3)只讀
RDD是隻讀的,要想改變RDD中的數據,只能在現有的RDD基礎上創建新的RDD。
由一個RDD轉換到另一個RDD,可以通過豐富的操作算子實現,不再像MapReduce那樣只能寫map和reduce了。
RDD的操作算子包括兩類,一類叫做transformations,它是用來將RDD進行轉化,構建RDD的血緣關係;另一類叫做actions,它是用來觸發RDD的計算,得到RDD的相關計算結果或者將RDD保存的文件系統中。下圖是RDD所支持的操作算子列表。
(4)依賴
RDDs通過操作算子進行轉換,轉換得到的新RDD包含了從其他RDDs衍生所必需的信息,RDDs之間維護着這種血緣關係,也稱之爲依賴。依賴包括兩種,一種是窄依賴,RDDs之間分區是一一對應的,另一種是寬依賴,下游RDD的每個分區與上游RDD(也稱之爲父RDD)的每個分區都有關,是多對多的關係。
(窄依賴不需要等待其他分區的計算,而寬分區需要)。
在這裏插入圖片描述
(5)緩存(存在內存)
如果在應用程序中多次使用同一個RDD,可以將該RDD緩存起來,該RDD只有在第一次計算的時候會根據血緣關係得到分區的數據,在後續其他地方用到該RDD的時候,會直接從緩存處取而不用再根據血緣關係計算,這樣就加速後期的重用。如下圖所示,RDD-1經過一系列的轉換後得到RDD-n並保存到hdfs,RDD-1在這一過程中會有個中間結果,如果將其緩存到內存,那麼在隨後的RDD-1轉換到RDD-m這一過程中,就不會計算其之前的RDD-0了。
(6)CheckPoint(存在磁盤)
雖然RDD的血緣關係天然地可以實現容錯,當RDD的某個分區數據失敗或丟失,可以通過血緣關係重建。但是對於長時間迭代型應用來說,隨着迭代的進行,RDDs之間的血緣關係會越來越長,一旦在後續迭代過程中出錯,則需要通過非常長的血緣關係去重建,勢必影響性能。爲此,RDD支持checkpoint將數據保存到持久化的存儲中,這樣就可以切斷之前的血緣關係,因爲checkpoint後的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章