什麼是RDD?RDD的特點?RDD與Dataframe的關係?

一、什麼是RDD?

RDD是Spark計算的時候操作的數據集,全稱是Resilient Distributed Datasets(彈性分佈式數據集)。

數據是分佈在多臺機器上的,爲了好處理,將這些分佈的數據抽象成一個RDD。這個RDD就是所有數據的代理,操作RDD就相當於操作分佈在每臺機器上的數據。

二、RDD 有三個基本特性

1. 分區

每一個 RDD 包含的數據被存儲在系統的不同節點上,是由很多分區組成的,操作RDD的時候,對RDD裏面的每一個分區進行操作。而這些操作真正的會分發到每臺機器上,並且擁有容錯機制。

在物理存儲中,每個分區指向一個存儲在內存或者硬盤中的數據塊 (Block) ,其實這個數據塊就是每個 task 計算出的數據塊,它們可以分佈在不同的節點上。

所以,RDD 只是抽象意義的數據集合,分區內部並不會存儲具體的數據,只會存儲它在該 RDD 中的 index,通過該 RDD 的 ID 和分區的 index 可以唯一確定對應數據塊的編號,然後通過底層存儲層的接口提取到數據進行處理。

在集羣中,各個節點上的數據塊會儘可能的存儲在內存中,只有當內存沒有空間時纔會放入硬盤存儲,這樣可以最大化的減少硬盤 IO 的開銷。

2. 不可變

不可變性是指每個 RDD 都是隻讀的,它所包含的分區信息是不可變的。由於已有的 RDD 是不可變的,所以我們只有對現有的 RDD 進行轉化 (Transformation) 操作,才能得到新的 RDD ,一步一步的計算出我們想要的結果。

這樣會帶來這樣的好處:我們在 RDD 的計算過程中,不需要立刻去存儲計算出的數據本身,我們只要記錄每個 RDD 是經過哪些轉化操作得來的,即:依賴關係,這樣一方面可以提高計算效率,一方面是錯誤恢復會更加容易。如果在計算過程中,第 N 步輸出的 RDD 的節點發生故障,數據丟失,那麼可以根據依賴關係從第 N-1 步去重新計算出該 RDD,這也是 RDD 叫做"彈性"分佈式數據集的一個原因,也會容錯機制。

3. 並行操作

因爲 RDD 的分區特性,所以其天然支持並行處理的特性。即不同節點上的數據可以分別被處理,然後生成一個新的 RDD。

三、RDD的操作

分爲兩種transformation和action

四、RDD 的結構

每個 RDD 裏都會包括分區信息、依賴關係等

依賴關係

窄依賴寬依賴。

依賴關係,記錄了該 RDD 的計算過程,也就是說這個 RDD 是通過哪個 RDD 經過怎麼樣的轉化操作得到的。窄依賴允許子 RDD 的每個分區可以被並行處理產生,而且支持在同一個節點上鍊式執行多條指令,無需等待其它父 RDD 的分區操作。

Spark 區分寬窄依賴的原因有兩點:

  1. 窄依賴支持在同一節點上進行鏈式操作。相反,款依賴需要所有父分區都是可用的。
  2. 從失敗恢復的角度考慮,窄依賴失敗恢復更有效,因爲只要重新計算丟失的父分區即可,而寬依賴涉及到 RDD 的各級多個父分區。

六、RDD和DataFrame的區別

DataFrameDataFrame是一種以RDD爲基礎的分佈式數據集,類似於傳統數據庫中的二維表格。DataFrame帶有schema元信息,即DataFrame所表示的二維表數據集的每一列都帶有名稱和類型。這使得SparkSQL得以洞察更多的結構信息,從而對藏於DataFrame背後的數據源以及作用於DataFrame之上的變換進行了針對性的優化,最終達到大幅提升運行時效率的目標。

RDD無從得知所存數據元素的具體內部結構,Spark Core只能在stage層面進行簡單、通用的流水線優化。

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