天天看點

什麼是RDD?帶你快速了解Spark中RDD的概念!

看了前面的幾篇Spark部落格,相信大家對于Spark的基本概念以及不同模式下的環境部署問題已經搞明白了。但其中,我們曾提到過Spark程式的核心,也就是彈性分布式資料集(RDD)。但到底什麼是RDD,它是做什麼用的呢?本篇部落格,我們就來詳細讨論它們的使用情況。

什麼是RDD?帶你快速了解Spark中RDD的概念!

RDD概述

1.什麼是RDD

RDD(Resilient Distributed Dataset)叫做分布式資料集,是Spark中最基本的資料抽象。代碼中是一個抽象類,它代表一個不可變、可分區、裡面的元素可并行計算的集合。

2.RDD的屬性

什麼是RDD?帶你快速了解Spark中RDD的概念!

- 1) A list of partitions

一個分區清單,一個rdd有多個分區,後期spark任務計算是以分區為機關,一個分區就對應上一個task線程。 通過val rdd1=sc.textFile(檔案) 如果這個檔案大小的block個數小于等于2,它産生的rdd的分區數就是2 如果這個檔案大小的block個數大于2,它産生的rdd的分區數跟檔案的block相同。

- 2)A function for computing each split

由一個函數計算每一個分片 比如: rdd2=rdd1.map(x=>(x,1)) ,這裡指的就是每個單詞計為1的函數。

- 3)A list of dependencies on other RDDs

一個rdd會依賴于其他多個rdd,這裡就涉及到rdd與rdd之間的依賴關系,後期spark任務的容錯機制就是根據這個特性而來。 比如: rdd2=rdd1.map(x=>(x,1)) rdd2的結果是通過rdd1調用了map方法生成,那麼rdd2就依賴于rdd1的結果 對其他RDD的依賴清單,依賴還具體分為寬依賴和窄依賴,但并不是所有的RDD都有依賴。

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

(可選項) 對于kv類型的rdd才會有分區函數(必須要産生shuffle),對于不是kv類型的rdd分區函數是None。 分區函數的作用:它是決定了原始rdd的資料會流入到下面rdd的哪些分區中。 spark的分區函數有2種:第一種hashPartitioner(預設值), 通過 key.hashcode % 分區數=分區号 第二種RangePartitioner,是基于一定的範圍進行分區。

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

(可選項) 一組最優的資料塊的位置,這裡涉及到資料的本地性和資料位置最優 spark後期在進行任務排程的時候,會優先考慮存有資料的worker節點來進行任務的計算。大大減少資料的網絡傳輸,提升性能。這裡就運用到了大資料中移動資料不如移動計算理念。

3.RDD特點

RDD表示隻讀的分區的資料集,對RDD進行改動,隻能通過RDD的轉換操作,由一個RDD得到一個新的RDD,新的RDD包含了從其他RDD衍生所必需的資訊。RDDs之間存在依賴,RDD的執行是按照血緣關系延時計算的。如果血緣關系較長,可以通過持久化RDD來切斷血緣關系。

3.1 分區

RDD邏輯上是分區的,每個分區的資料是抽象存在的,計算的時候會通過一個compute函數得到每個分區的資料。如果RDD是通過已有的檔案系統建構,則compute函數是讀取指定檔案系統中的資料,如果RDD是通過其他RDD轉換而來,則compute函數是執行轉換邏輯将其他RDD的資料進行轉換。

什麼是RDD?帶你快速了解Spark中RDD的概念!

3.2 隻讀

如下圖所示,RDD是隻讀的,要想改變RDD中的資料,隻能在現有的RDD基礎上建立新的RDD。

什麼是RDD?帶你快速了解Spark中RDD的概念!

由一個RDD轉換到另一個RDD,可以通過豐富的操作算子實作,不再像MapReduce那樣隻能寫map和reduce了,如下圖所示。

什麼是RDD?帶你快速了解Spark中RDD的概念!

RDD的操作算子包括兩類,一類叫做transformations

轉化

,它是用來将RDD進行轉化,建構RDD的血緣關系;另一類叫做actions

動作

,它是用來觸發RDD的計算,得到RDD的相關計算結果或者将RDD儲存的檔案系統中。

3.3 依賴

RDDs通過操作算子進行轉換,轉換得到的新RDD包含了從其他RDDs衍生所必需的資訊,RDDs之間維護着這種血緣關系,也稱之為依賴。如下圖所示,依賴包括兩種,一種是窄依賴,RDDs之間分區是一一對應的,另一種是寬依賴,下遊RDD的每個分區與上遊RDD(也稱之為父RDD)的每個分區都有關,是多對多的關系。

什麼是RDD?帶你快速了解Spark中RDD的概念!

3.4 緩存

如果在應用程式中多次使用同一個RDD,可以将該RDD緩存起來,該RDD隻有在第一次計算的時候會根據血緣關系得到分區的資料,在後續其他地方用到該RDD的時候,會直接從緩存處取而不用再根據血緣關系計算,這樣就加速後期的重用。如下圖所示,RDD-1經過一系列的轉換後得到RDD-n并儲存到hdfs,RDD-1在這一過程中會有個中間結果,如果将其緩存到記憶體,那麼在随後的RDD-1轉換到RDD-m這一過程中,就不會計算其之前的RDD-0了。

什麼是RDD?帶你快速了解Spark中RDD的概念!

3.5 CheckPoint

雖然RDD的血緣關系天然地可以實作容錯,當RDD的某個分區資料失敗或丢失,可以通過血緣關系重建。但是對于長時間疊代型應用來說,随着疊代的進行,RDDs之間的血緣關系會越來越長,一旦在後續疊代過程中出錯,則需要通過非常長的血緣關系去重建,勢必影響性能。為此,RDD支援checkpoint将資料儲存到持久化的存儲中,這樣就可以切斷之前的血緣關系,因為checkpoint後的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到資料。

好了,本次的分享就到這裡,受益的小夥伴或對大資料技術感興趣的朋友可以點個贊喲,下一篇将為大家帶來

RDD程式設計

,敬請期待!!!