Spark第二天的RDD概念

3.25.15 RDD概念(重要)

RDD(Resilient Distributed Dataset)叫做彈性分佈式數據集,是Spark中最基本的數據抽象,它代表一個不可變、可分區、裏面的元素可並行計算的集合。RDD具有數據流模型的特點:自動容錯、位置感知性調度和可伸縮性。RDD允許用戶在執行多個查詢時顯式地將工作集緩存在內存中,後續的查詢能夠重用工作集,這極大地提升了查詢速度。

在之前學習MR的過程中對數據是沒有進行抽象的,而在Spark中對數據進行了抽象,提供一些列處理方法也就是說RDD(彈性分佈式數據集),Spark計算的基石,爲用戶屏蔽了底層對數據的複雜抽象和處理,爲用戶提供了一組方便的數據轉換與求值方法。

現在開發的過程中都是面向對象的思想,那麼我們創建類的時候會對類封裝一些屬性和方法,那麼創建出來的對象就具備着這些屬性和方法,類也屬於對數據的抽象,而Spark中的RDD就是對操作數據的一個抽象

查看原碼可以得知,而且在類中提供了很多方法可以使用
在這裏插入圖片描述
總結:

在 Spark 中,對數據的所有操作不外乎創建 RDD、轉化已有RDD 以及調用 RDD 操作進行求值。每個 RDD 都被分爲多個分區,這些分區運行在集羣中的不同節點上。RDD 可以包含 Python、Java、Scala 中任意類型的對象, 甚至可以包含用戶自定義的對象。RDD具有數據流模型的特點:自動容錯、位置感知性調度和可伸縮性。RDD允許用戶在執行多個查詢時顯式地將工作集緩存在內存中,後續的查詢能夠重用工作集,這極大地提升了查詢速度。

RDD做了什麼
sc.textFile(“xx").flatMap(_.split("")).map((_,1)).reduceByKey(_+_).saveAsTextFile(“xx")

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FkrCrYyK-1572874233864)(./image/圖片2.png)]

總結:

RDD的創建->RDD的轉換(轉換過程中爲了減少數據計算有添加緩存)->RDD的行動(輸出數據)

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

5)一個列表,存儲存取每個Partition的優先位置(preferred location)。對於一個HDFS文件來說,這個列表保存的就是每個Partition所在的塊的位置。按照“移動數據不如移動計算”的理念,Spark在進行任務調度的時候,會盡可能地將計算任務分配到其所要處理數據塊的存儲位置。

總結(RDD的五大特徵):

1.RDD可以看做是一些列partition所組成的

2.RDD之間的依賴關係

3.算子是作用在partition之上的

4.分區器是作用在kv形式的RDD上

5.partition提供的最佳計算位置,利於數據處理的本地化即計算向數據移動而不是移動數據

ps:RDD本身是不存儲數據,可以看做RDD本身是一個引用數據

RDD彈性
  1. 自動進行內存和磁盤數據存儲的切換

​ Spark優先把數據放到內存中,如果內存放不下,就會放到磁盤裏面,程序進行自動的存儲切換

  1. 基於血統的高效容錯機制

​ 在RDD進行轉換和動作的時候,會形成RDD的Lineage依賴鏈,當某一個RDD失效的時候,可以通過重新計算上游的RDD來重新生成丟失的RDD數據。

  1. Task如果失敗會自動進行特定次數的重試

​ RDD的計算任務如果運行失敗,會自動進行任務的重新計算,默認次數是4次。

  1. Stage如果失敗會自動進行特定次數的重試

​ 如果Job的某個Stage階段計算失敗,框架也會自動進行任務的重新計算,默認次數也是4次。

  1. Checkpoint和Persist可主動或被動觸發

​ RDD可以通過Persist持久化將RDD緩存到內存或者磁盤,當再次用到該RDD時直接讀取就行。也可以將RDD進行檢查點,檢查點會將數據存儲在HDFS中,該RDD的所有父RDD依賴都會被移除。

  1. 數據調度彈性

​ Spark把這個JOB執行模型抽象爲通用的有向無環圖DAG,可以將多Stage的任務串聯或並行執行,調度引擎自動處理Stage的失敗以及Task的失敗。

  1. 數據分片的高度彈性

​ 可以根據業務的特徵,動態調整數據分片的個數,提升整體的應用執行效率。

​ RDD全稱叫做彈性分佈式數據集(Resilient Distributed Datasets),它是一種分佈式的內存抽象,表示一個只讀的記錄分區的集合,它只能通過其他RDD轉換而創建,爲此,RDD支持豐富的轉換操作(如map, join, filter, groupBy等),通過這種轉換操作,新的RDD則包含了如何從其他RDDs衍生所必需的信息,所以說RDDs之間是有依賴關係的。基於RDDs之間的依賴,RDDs會形成一個有向無環圖DAG,該DAG描述了整個流式計算的流程,實際執行的時候,RDD是通過血緣關係(Lineage)一氣呵成的,即使出現數據分區丟失,也可以通過血緣關係重建分區,總結起來,基於RDD的流式計算任務可描述爲:從穩定的物理存儲(如分佈式文件系統)中加載記錄,記錄被傳入由一組確定性操作構成的DAG,然後寫回穩定存儲。另外RDD還可以將數據集緩存到內存中,使得在多個操作之間可以重用數據集,基於這個特點可以很方便地構建迭代型應用(圖計算、機器學習等)或者交互式數據分析應用。可以說Spark最初也就是實現RDD的一個分佈式系統,後面通過不斷髮展壯大成爲現在較爲完善的大數據生態系統,簡單來講,Spark-RDD的關係類似於Hadoop-MapReduce關係。

總結:

存儲的彈性:內存與磁盤的

自動切換容錯的彈性:數據丟失可以

自動恢復計算的彈性:計算出錯重試機制

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章