【spark 深入學習 03】Spark RDD的蠻荒世界
RDD真的是一個很晦澀的詞匯,他就是伯克利大學的博士們在論文中提出的一個概念,很抽象,很難懂;但是這是spark的核心概念,因此有必要spark rdd的知識點,用最簡單、淺顯易懂的詞匯描述。不想用學術話的語言來闡述RDD是什麽,用簡單、容易理解的方式來描述。
一、什麽是RDD,RDD出現的背景
Mapreduce計算模型的出現解決了分布式計算的諸多難題,但是由於MR對數據共享的解決方案比較低效,導致MR編程模型效率不高,將數據寫到一個穩定的外部存儲系統,如HDFS,這個會引起數據復寫、磁盤IO、磁盤序列化和反序列化等操作。RDD可以指定策略,能不寫入的到磁盤的就不寫入。總結起來,MR經常和磁盤交互,中間結果不復用,導致中途做很多無用功。
二、RDD概念
RDD,residenta distributed dataset,彈性分布式數據集
1)數據集
如果你熟悉數據庫,那麽RDD從表現形式上講最類似於數據庫的視圖(View)去除這個RDD在物理結構上的特色,單從邏輯上的表現來說,他就是一個數據集合。什麽是數據集合?可以理解為Java中的一個list,或者是數據庫裏的一張表(或者視圖)等等。既然是一張表,我們可以理解Spark對RDD的操作,其實類似於SQL裏面對表的一些操作。每個RDD有5個主要的屬性:
·一組分片(partition),即數據集的基本組成單位
·一個計算每個分片的函數
·對parent RDD的依賴,這個依賴描述了RDD之間的lineage
·對於key-value的RDD,一個Partitioner
·一個列表,存儲存取每個partition的preferred位置。對於一個HDFS文件來說,存儲每個partition所在的塊的位置。
2)彈性
最開始的時候我說RDD最類似數據庫的視圖,那為什麽是視圖而不是表呢?這就要說說RDD裏面的這個R(彈性),什麽叫彈性呢,就是一個RDD的數據並不一定是物理上真是存在的,註意是不一定,就像數據庫裏的視圖(view),只有你在query的時候他才會真正計算出這些數據。RDD裏的數據也一樣,比如一張全是大寫地名的表-- {S: SHANGHAI, BEIJING, ...},可能在RDD裏是這樣一種形式 {S = S1:{Shanghai, BEIJing, ...}. toUPPERcase }. 前面提到的兩個數集合在物理上的內容其實是不一樣的,但是你能看到的兩個集合是一樣的。在Spark裏面,類似於toUPPERcase 這樣的操作我們叫算子。好了,這樣你就理解了這個R,也是RDD最難懂的一個地方。
3)分布式
再說說中間的那個D(分布式),這個很好理解,就是一個數據集分別放在幾個機器上,而RDD只要存儲這些數據的元信息(如那一片在哪個機器上)即可。這樣也就不難理解之前“仲晟”的回答:“RDD,包含一組分區列表(實際上是分區到block的映射,具體數據可以是分布式的存儲在HDFS各個節點上)以及一組transformation或action算子等。”
4)容錯
不過這樣解釋似乎缺了些什麽,就是為什麽RDD要如此麻煩呢?這裏我說最明顯的兩個亮點。1,容錯:比如你有一個表,裏面是一個公司12個月的平均銷售額,存儲在12個機器上,突然存儲8月數據的機器壞了,那麽你通常選擇的做法是把整一年的銷售資料拿出來,再以月份分組,再把8月的算出來,存在一個好的機器裏。而RDD存儲8月的數據可能就是(select avg(sales)from t where month = 8) ,在你需要的時侯,如果發現8月數據不在了,可以自動從原數據裏把這個數據恢復出來。(這個例子並不是特別真實,只不過很簡單的幫你理解容錯這個特性)。
5)執行效率優化
一個優點是執行效率優化。假設有這麽一個情況,有一個數據表,先把裏面的數據都+1,再-1,再+1,再-1.這樣顯然數據應該都是不變的。如果你每次都把這個數據表都算出來,這樣就要執行4次O(n)效率的查找。然而用RDD的思路,{S‘} = {S}+1-1+1-1 => {S‘} = {s} + 0, 這樣就大大提高了效率。(同樣這個例子很弱智,但是能幫助你理解RDD為什麽要用數據+算子的形式去描述一個數據集).
在所有解釋中我忽略了Spark平臺,HDFS等因為穿在一起真的很難講的通俗易懂。只是盡可能的用大白話來講。若要深入了解還需要結合Spark的運行機制,Hadoop的HDFS,Scala的語法共同來理解RDD這樣東西。
【spark 深入學習 03】Spark RDD的蠻荒世界