大白話講解Spark中的RDD

這孩子誰懂哈發表於2020-11-15

資料中:

Spark 中最基本的資料抽象是 RDD。

RDD:彈性分散式資料集 (Resilient Distributed DataSet)。

RDD的三個特性:分割槽,不可變,並行操作。

• RDD 是 Spark 的最基本抽象,是對分散式記憶體的抽象使用,實現了以操作本地集合的方式
來 操作分散式資料集的抽象實現
• RDD 是 Spark 最核心的東西,它表示已被分割槽,不可變的並能 夠被並行操作的資料集合,
不同的資料集格式對應不同的 RDD 實現
RDD特點:
• RDD 必須是可序列化的
• 只讀:狀態不可變,不能修改
• 分割槽:支援元素根據 Key 來分割槽( Partitioning ) ,儲存到多個結點上
• RDD 需要從其他資料集變換而來
• RDD 包含轉換與Action操作
• 對於不同的系統RDD不同,如HadoopRDD,JDBCRDD…

一臉懵逼 有沒有?

在學習spark中的知識點的時候,發現總是經常把dataframe或者dataset轉化成RDD,就很奇怪為什麼要做這方面的轉化,RDD又是何方神聖呢?
如果你熟悉資料庫,那麼RDD從表現形式上講最類似於資料庫的檢視(View)
去除這個RDD在物理結構上的特色,單從邏輯上的表現來說,他就是一個資料集合
什麼是資料集合?

可以理解為Java中的一個list,或者是資料庫裡的一張表(或者檢視)等等。
既然是一張表,我們可以理解Spark對RDD的操作,其實類似於SQL裡面對錶的一些操作。
在最開始的時候我說RDD最類似資料庫的檢視,那為什麼是檢視而不是表呢?

這就要說說RDD裡面的這個R(彈性),什麼叫彈性呢?

就是一個RDD的資料並不一定是物理上真是存在的,注意是不一定,就像資料庫裡的檢視(view),只有你在query的時候他才會真正計算出這些資料。RDD裡的資料也一樣,

比如一張全是大寫地名的表-- {S: SHANGHAI, BEIJING, ...},可能在RDD裡是這樣一種形式 {S = S1:{Shanghai, BEIJing, ...}. toUPPERcase }.

前面提到的兩個數集合在物理上的內容其實是不一樣的,但是你能看到的兩個集合是一樣的。在Spark裡面,類似於toUPPERcase 這樣的操作我們叫運算元。好了,這樣你就理解了這個R,也是RDD最難懂的一個地方。再說說中間的那個D(分散式),這個很好理解,就是一個資料集分別放在幾個機器上,而RDD只要儲存這些資料的元資訊(如那一片在哪個機器上)即可。


不過這樣解釋似乎缺了些什麼,就是為什麼RDD要如此麻煩呢?

這裡我說最明顯的兩個亮點。

1,容錯

比如你有一個表,裡面是一個公司12個月的平均銷售額,儲存在12個機器上,突然儲存8月資料的機器壞了,那麼你通常選擇的做法是把整一年的銷售資料拿出來,再以月份分組,再把8月的算出來,存在一個好的機器裡。而RDD儲存8月的資料可能就是(select avg(sales)from t where month = 8) ,在你需要的時侯,如果發現8月資料不在了,可以自動從原資料裡把這個資料恢復出來。(這個例子並不是特別真實,只不過很簡單的幫你理解容錯這個特性)。

2,是執行效率優化。假設有這麼一個情況,有一個資料表,先把裡面的資料都+1,再-1,再+1,再-1. 這樣顯然資料應該都是不變的。如果你每次都把這個資料表都算出來,這樣就要執行4次O(n)效率的查詢。然而用RDD的思路,{S'} = {S}+1-1+1-1 => {S'} = {s} + 0, 這樣就大大提高了效率。(同樣這個例子很弱智,但是能幫助你理解RDD為什麼要用資料+運算元的形式去描述一個資料集).

若要深入瞭解還需要結合Spark的執行機制,Hadoop的HDFS,Scala的語法共同來理解RDD這樣東西

 

總結:RDD就是一個虛擬的、分割槽的、可並行操作的具有容錯率高,執行優化效率高的資料集。

相關文章