什麼是 RDD ?

Spark 中最基本的數據抽象是 RDD。數組

RDD:彈性分佈式數據集 (Resilient Distributed DataSet)。緩存

1,RDD 有三個基本特性

這三個特性分別爲:分區,不可變,並行操做。分佈式

a, 分區

每個 RDD 包含的數據被存儲在系統的不一樣節點上。邏輯上咱們能夠將 RDD 理解成一個大的數組,數組中的每一個元素就表明一個分區 (Partition) 。函數

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

因此,RDD 只是抽象意義的數據集合,分區內部並不會存儲具體的數據,只會存儲它在該 RDD 中的 index,經過該 RDD 的 ID 和分區的 index 能夠惟一肯定對應數據塊的編號,而後經過底層存儲層的接口提取到數據進行處理。3d

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

b,不可變

不可變性是指每一個 RDD 都是隻讀的,它所包含的分區信息是不可變的。因爲已有的 RDD 是不可變的,因此咱們只有對現有的 RDD 進行轉化 (Transformation) 操做,才能獲得新的 RDD ,一步一步的計算出咱們想要的結果。cdn

這樣會帶來這樣的好處:咱們在 RDD 的計算過程當中,不須要馬上去存儲計算出的數據自己,咱們只要記錄每一個 RDD 是通過哪些轉化操做得來的,即:依賴關係,這樣一方面能夠提升計算效率,一方面是錯誤恢復會更加容易。若是在計算過程當中,第 N 步輸出的 RDD 的節點發生故障,數據丟失,那麼能夠根據依賴關係從第 N-1 步去從新計算出該 RDD,這也是 RDD 叫作**"彈性"**分佈式數據集的一個緣由。對象

c,並行操做

由於 RDD 的分區特性,因此其自然支持並行處理的特性。即不一樣節點上的數據能夠分別被處理,而後生成一個新的 RDD。blog

2,RDD 的結構

每一個 RDD 裏都會包括分區信息、依賴關係等等的信息,以下圖所示:

RDD圖解

a,Partitions

Partitions 就是上面所說的,表明着 RDD 中數據的邏輯結構,每一個 Partion 會映射到某個節點內存或者硬盤的一個數據塊。

b,SparkContext

SparkContext 是全部 Spark 功能的入口,表明了與 Spark 節點的鏈接,能夠用來建立 RDD 對象以及在節點中的廣播變量等等。一個線程只有一個 SparkContext。

c,SparkConf

SparkConf 是一些配置信息。

d,Partitioner

Partitioner 決定了 RDD 的分區方式,目前兩種主流的分區方式:Hash partioner 和 Range partitioner。Hash 就是對數據的 Key 進行散列分佈,Rang 是按照 Key 的排序進行的分區。也能夠自定義 Partitioner。

e,Dependencies

Dependencies 也就是依賴關係,記錄了該 RDD 的計算過程,也就是說這個 RDD 是經過哪一個 RDD 通過怎麼樣的轉化操做獲得的。

這裏有個概念,根據每一個 RDD 的分區計算後生成的新的 RDD 的分區的對應關係,能夠分紅窄依賴和寬依賴。

窄依賴就是父 RDD 的分區能夠一一對應到子 RDD 的分區,寬依賴是說父 RDD 的每一個分區能夠被多個子 RDD 分區使用。如圖:

窄依賴

因爲窄依賴的特性,窄依賴容許子 RDD 的每一個分區能夠被並行處理產生,並且支持在同一個節點上鍊式執行多條指令,無需等待其它父 RDD 的分區操做。

寬依賴

Spark 區分寬窄依賴的緣由主要有兩點:

  1. 窄依賴支持在同一節點上進行鏈式操做,好比在執行了 map 後,緊接着執行 filter 操做。相反,款依賴須要全部父分區都是可用的。
  2. 從失敗恢復的角度考慮,窄依賴失敗恢復更有效,由於只要從新計算丟失的父分區便可,而寬依賴涉及到 RDD 的各級多個父分區。

f,Checkpoint

檢查點機制,在計算過程當中有一些比較耗時的 RDD,咱們能夠將它緩存到硬盤或者 HDFS 中,標記這個 RDD 有被檢查點處理過,而且清空它的全部依賴關係。同時,給它新建一個依賴於 CheckpointRDD 的依賴關係,CheckpintRDD 能夠用來從 硬盤中讀取 RDD 和生成新的分區信息。

這麼作以後,當某個 RDD 須要錯誤恢復時,回溯到該 RDD,發現它被檢查點記錄過,就能夠直接去硬盤讀取該 RDD,無需從新計算。

g,Preferred Location

針對每個分片,都會選擇一個最優的位置來計算,數據不動,代碼動。

h,Storage Level

用來記錄 RDD 持久化時存儲的級別,經常使用的有:

  1. MEMORY_ONLY:只存在緩存中,若是內存不夠,則不緩存剩餘的部分。這是 RDD 默認的存儲級別。
  2. MEMORY_AND_DISK:緩存在內存中,不夠則緩存至內存。
  3. DISK_ONLY:只存硬盤。
  4. MEMORY_ONLY_2 和 MEMORY_AND_DISK_2等:與上面的級別和功能相同,只不過每一個分區在集羣兩個節點上創建副本。

i,Iterator

迭代函數和計算函數是用來表示 RDD 怎樣經過父 RDD 計算獲得的。

迭代函數首先會判斷緩存中是否有想要計算的 RDD,若是有就直接讀取,若是沒有就查找想要計算的 RDD 是否被檢查點處理過。若是有,就直接讀取,若是沒有,就調用計算函數向上遞歸,查找父 RDD 進行計算。

相關文章
相關標籤/搜索