Spark RDD筆記

從這裏學習的,講的真好~ https://www.bilibili.com/video/av62992342/?p=41

JAVA IO : 裝飾者設計模式

IO.png

Spark的RDD也是類似的

RDD.png

RDD是將數據處理的邏輯進行了封裝。
JAVA讀數據並不是直接讀文件,而是在readLine的時候去讀。
Spark是在Collect被觸發的時候去讀數據,所以需要execute驅動。

什麼是RDD

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

屬性

一組分區(Partition),即數據集的基本組成單位
一個計算每個分區的函數
RDD之間的依賴關係
一個Partitioner,RDD的分片函數
一個列表,存儲存取每個Partition的優先位置(Preferred location)。(幫助判斷數據所在的位置,找近的)

選擇Executor.png

RDD特點

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

RDD分區

RDD邏輯上是分區的,每個分區的數據是抽象存在的,計算的時候會通過一個compute函數得到每個分區的數據。
如果RDD是通過已有的文件系統構建,則compute函數是 讀取指定文件系統中的數據。
如果RDD是通過其他RDD轉換而來,那麼compute函數是 執行轉換邏輯將其他RDD的數據進行轉換。

只讀

RDD是隻讀的,想改變RDD的數據,只能在現有的RDD基礎上創建新的RDD。
由一個RDD轉換到另一個RDD,可以通過豐富的算子操作實現,不必像MR,寫map和reduce。

那麼啥是算子?

從認知心理學角度,解決問題,其實是將問題的 初始狀態,通過一系列操作(算子)對問題的狀態進行轉換,然後達到解決狀態。(其實就是一頓操作解決問題)

Spark中的所有RDD方法都稱之爲算子,但分爲2大類:轉換算子 & 行動算子。

依賴

RDD之間通過算子進行轉換,轉換得到新RDD包含從其他RDD衍生所必須的信息。RDD之間維護着這種血緣關係,也稱之爲依賴。依賴包含兩種。
窄依賴,RDDs之間的分區是一一對應的。
寬依賴,下游RDD的每個分區與上游RDD的每個分區都有關,多對多的關係。

緩存

如果在應用程序中多次使用同一個RDD,可以將RDD緩存起來,該RDD只有在第一次計算的時候,會根據血緣關係得到分區數據。後續使用到RDD的時候,會直接從緩存處取而不用再根據血緣關係計算,加速重用。

RDD創建

Spark中創建RDD的方式有三種:集合中創建RDD;外部存儲創建RDD;從其他RDD創建;

集合中創建

Spark提供兩個函數parallelize和makeRDD,沒啥區別。

//創建RDD 這倆太大區別
// 1 從內存中創建 makeRDD
val listRDD = sc.makeRDD(List(1,2,3,4))
// 2 從內存中創建 parallelize
val arrayRDD = sc.parallelize(Array(1,2,3,4))

listRDD.collect().foreach(println)
arrayRDD.collect().foreach(println)

外部存儲創建RDD

包括本地文件系統,HDFS和HBASE也支持
// 3 從外部存儲中創建
// 默認情況下,可以讀取項目路徑,也可以讀取HDFS之類的
// 默認從文件中讀取的數據都是字符串類型
val fileRDD = sc.textFile(“hdfs://Master:9000/in”)

從其他RDD創建新RDD

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