天天看點

從源碼中進行詳細剖析什麼是RDD

1 源碼位址

  • 源碼位址,這裡建議搭建使用maven進行項目建構,友善檢視源碼。

2 什麼是RDD

下圖給出了源碼中的一段注釋:

從源碼中進行詳細剖析什麼是RDD

可以了解為:是彈性分布式資料集,是spark中最基本的資料抽象,它代表一個不可變、可分區、裡面的元素可并行計算的集合;這個資料集的全部或部分可以緩存在記憶體中,在多次計算間重用。

1. Resilient:是指在任何時候都能進行重算,是一種有容錯機制的特殊集合。(這樣當叢集中的一台機器挂掉而導緻存儲在其上的RDD丢失後,Spark還可以重新計算出這部分的分區的資料。但使用者感覺不到這部分的内容丢失過。這樣RDD資料集就像塊帶有彈性的海綿一樣,不管怎樣擠壓(分區遭到破壞)都是完整的。)

2. Distributed:它的資料分布式存儲,并且可以做分布式的計算;

3. Dataset:一個資料集,簡單的了解為用于存放資料的集合。

3 RDD的五大特性

從源碼中進行詳細剖析什麼是RDD

1. A list of partitions (每個RDD都有一個分區清單)

2. A function for computing each split (作用在每個分區上面的函數)

3. A list of dependencies on other RDDs (一個RDD依賴其他多個RDD,這個特性很重要,rdd的容錯機制就是根據這個特性而來的)

4. Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) [可選項:針對于 kv 鍵值對的RDD才具有該分區特性]

5.Optionally, a list of preferred locations to compute each split on (e.g. block locations foran HDFS file) [可選項 : 資料本地性,資料最優,選擇盡量存儲在worker節點上的資料節點。]

  • 進一步剖析

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的Parititioner的值是None。Partitioner函數不但決定了RDD本身的分片數量,也決定了parent RDD Shuffle輸出時的分片數量。

5)一個清單,存儲存取每個Partition的優先位置(preferred location)。

對于一個HDFS檔案來說,這個清單儲存的就是每個Partition所在的塊的位置。按照“移動資料不如移動計算”的理念,Spark在進行任務排程的時候,會盡可能地将計算任務配置設定到其所要處理資料塊的存儲位置。

繼續閱讀