1. 程式人生 > >@瀟灑哥

@瀟灑哥

1、什麼是RDD

RDD(Resilient Distributed Dataset)叫做彈性分散式資料集,是Spark中最基本的資料抽象,它代表一個不可變、可分割槽、裡面的元素可平行計算的集合。

RDD具有資料流模型的特點:自動容錯、位置感知性排程和可伸縮性。

RDD允許使用者在執行多個查詢時顯式地將工作集快取在記憶體中,後續查詢能重用工作集,這極大地提升了查詢速度。

2、RDD的屬性

(1)一組分片(Partition),級資料集的基本組成單位。

        對於RDD來說,每個分片都會被一個計算任務處理,並決定平行計算的粒度。使用者可以在建立RDD時指定RDD的分片個數,如果沒有指定,那麼就會採用預設值。預設值就是程式分配到的CPU Core數目。

(2)一個計算每個分割槽的函式

        Spark中RDD的計算是以分片為單位的,每個RDD都會實現compute函式以達到這個目的。compute函式會對迭代器進行復合,不需要儲存每次計算的結果。

(3)RDD之間的依賴關係

        RDD的每次轉換都會生成一個新的RDD,所以RDD之間就會形成類似於流水線一樣的前後依賴關係。在部分分割槽資料丟失時Spark可以通過這個依賴關係重新計算丟失的分割槽資料,而不是對RDD的所有分割槽進行重新計算。

(4)一個Partitioner,即RDD的分片函式

        當前Spark中實現了兩種型別的分片函式,一個是基於雜湊的HashPartitioner,另外一個是基於範圍的RangePartitioner。只有對與key-value的RDD,才會有Partitioner,非key-value的RDD的Partitioner的值是None,Partitioner函式不但決定了RDD本身的分片數量,也決定了parent RDD Shuffle輸出時的分片數量。

(5)一個列表,儲存存取每個Partition的優先位置(preferred location)

        對與HDFS檔案來說,這個列表儲存的就是每個Partition所在的塊的位置。按照“移動資料不如移動計算”的理論,Spark在進行任務排程的時候,會盡可能地將計算任務分配到其所要處理資料塊的儲存位置。

RDD的兩種生成方式

1、 val rdd = sc.textFile("hdfs://master:9000/input")

2、 val rdd = sc.parallelize(Array(1,2,3,4,5,6,7,8))

RDD兩種型別的運算元:transformation、action