sprak中的RDD

(一) 什麼是RDD

●為什麼要有RDD?

在許多迭代式算法(比如機器學習、圖算法等)和交互式數據挖掘中,不同計算階段之間會重用中間結果,即一個階段的輸出結果會作為下一個階段的輸入。但是,之前的MapReduce框架採用非循環式的數據流模型,把中間結果寫入到HDFS中,帶來了大量的數據複製、磁盤IO和序列化開銷。且這些框架只能支持一些特定的計算模式(map/reduce),並沒有提供一種通用的數據抽象。

AMP實驗室發表的一篇關於RDD的論文:《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》

就是為了解決這些問題的,RDD提供了一個抽象的數據模型,讓我們不必擔心底層數據的分佈式特性,只需將具體的應用邏輯表達為一系列轉換操作(函數),不同RDD之間的轉換操作之間還可以形成依賴關係,進而實現管道化,從而避免了中間結果的存儲,大大降低了數據複製、磁盤IO和序列化開銷,比且還提供了更多的API(map/reduec/reducebykey/fileter...)。

●總結:RDD做了什麼?

1.中間結果保存在內存中,並重用

2.提供了通用的抽象的分佈式的數據模型

3.提供了多種數據操作模式(支持函數式編程)

總之相比與傳統的MapReduce,RDD更快速、更通用、更靈活

●RDD是什麼?

RDD(Resilient Distributed Dataset)叫做彈性分佈式數據集,是Spark中最基本的數據抽象,代表一個不可變、可分區、裡面的元素可並行計算的集合。

單詞拆解

- Dataset: 它是一個集合,可以存放很多元素

- Distributed :它裡面的元素是分佈式存儲的,可以用於分佈式計算

- Resilient :它是彈性的,RDD裡面的中的數據可以保存在內存中或者磁盤裡面

存儲的彈性:內存與磁盤的自動切換、存儲靈活

容錯的彈性:數據丟失可以自動恢復

計算的彈性:計算出錯重試機制、計算的模式的靈活性

分片的彈性:根據需要重新分片

●總結

RDD具有數據流模型的特點:自動容錯、位置感知性調度和可伸縮。

RDD將Spark的底層的細節都隱藏起來了(任務調度、Task執行,任務失敗重試等待)

開發者使用起來可以像操作本地集合一樣以函數式編程的方式操作RDD這個抽象的分佈式數據集進行各種並行計算

(二) RDD的主要屬性

sprak中的RDD

1.A list of partitions :

一組分片(Partition)/一個分區(Partition)列表,即數據集的基本組成單位。

對於RDD來說,每個分片都會被一個計算任務處理,分片數決定並行度。

用戶可以在創建RDD時指定RDD的分片個數,如果沒有指定,那麼就會採用默認值。

2.A function for computing each split :

一個函數會被作用在每一個分區。

Spark中RDD的計算是以分片為單位的,compute函數會被作用到每個分區上

3.A list of dependencies on other RDDs:

一個RDD會依賴於其他多個RDD。

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

4.Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned):

可選項,對於KV類型的RDD會有一個Partitioner,即RDD的分區函數

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

5.Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file):

可選項,一個列表,存儲存取每個Partition的優先位置(preferred location)。

對於一個HDFS文件來說,這個列表保存的就是每個Partition所在的塊的位置。按照"移動數據不如移動計算"的理念,Spark在進行任務調度的時候,會盡可能選擇那些存有數據的worker節點來進行任務計算。

●總結

簡單的說就是:

1.分區列表

2.計算函數

3.依賴關係

4.分區函數(默認是hash)

5.最佳位置

分區列表, 分區函數, 最佳位置, 這三個屬性其實說的就是數據集在哪, 在哪計算更合適, 如何分區

計算函數和依賴關係, 這兩個屬性其實說的是數據集怎麼來的

所以結論是 RDD 是一個數據集的表示, 不僅表示了數據集, 還表示了這個數據集從哪來, 如何計算


分享到:


相關文章: