2014年11月18日 星期二

[Apache Spark][基本架構] 關於RDD中的不可變性(immutable)


        剛開始接觸RDD時,會覺得RDD是一個裝資料的貨櫃(Container).再多瞭解一點後,才發現RDD更像裝洋片的太空包對不起我肚子餓了).貨櫃和太空包的差異在於:貨櫃可以裝不同的東西,把東西拿出來再擺回去,但是當洋芋片裝到太空包後,如果要吃或分裝,就得把太空包拆開.


        這是Spark關於RDD這個物件的描述:A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable, partitioned collection of elements that can be operated on in parallel.(http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.RDD) RDD是Spark的核心框架,有非常多的特性,“不可變性(immutable)”是第二個重點.所謂的不可變性是說,當資料轉換成RDD物件後,那個RDD物件基本就處於被封裝的狀態,如果要進行filter或map的動作,會在使用另外一個RDD來封裝改變後的資料.這點其實也反映在[Scala] 型態抹除這點上面,當資料丟到RDD後,我們僅能從包裝上(RDD[Int],RDD[Double])來辨識裡面裝的東西,而無法直接看到裡面的資料類型.除了型態之外,Spark也設計了不同的RDD來表示各種對RDD的操作結果:

(詳細的RDD家族列表:
https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/rdd)
在每個階段都會轉換成相對應的RDD來裝操作後的資料,而不是將操作的結果放回原來的RDD中(貨櫃vs太空包).

下面是簡單Run一下程式中會出現的各種RDD:

例子中每行程式下面的註解就是執行後吐出來的物件型態.可以看到隨著filter,map的指令出現不同的RDD型態,執行完一次就換下一個的態度可比李宗瑞.雖然spark透過RDD封裝,讓我們在執行時並不會直接碰到下一層中的各種RDD,但是還要記得中間的各個過程其實是不同RDD再切換,所以RDD本身是不可變動的.