RDD

RDD 是 Spark 運算的基本單位,全名為 Resilient Distributed Datasets,富有彈性的分散式資料集 XD

它具備著以下特性:

  • immutable 的分散式物件集合 : immutable 可以想做是"不可變的",而分散式物件集合意味著,他可以分散式的儲存在各個節點,並同時在各個節點運算它的一部分,而各個部分同時也是一個RDD,所以無論是想切得更細或是結合在一起都沒有問題。

  • RDD 可以包含 Scala、Java、Python 的物件,包括使用者自定義的 class。

  • Lineage 機制 : 這個機制會記錄每個 RDD 的 Parent RDD,並記錄了該 RDD 是從 Parent RDD 做了哪些運算而來。

  • Lazy : RDD 的執行動作會在 Transformation 指令時儲存,並在 Action 指令全部一次執行。

  • 綜合以上特性,RDD 具備了容錯機制,一旦有 RDD 有損壞,便可以重新從 Parent RDD 再產生一次。

  • 每個RDD 因為是 immutable 的,所以都是獨一無二,所有的操作都只會產生新的 RDD,而不會改動到原先的RDD。

三大基本操作 :

  • Transformation : 針對 RDD 的操作,每個操作都會產生新的RDD,而因為 Lazy 特性,只會在 Action 時執行。

  • Action : 針對 RDD 的操作,並回傳最後的結果,無論是回傳到 Driver Program,還是寫出到任何資料儲存的系統,但要注意每一次 Action 的執行,都會從 Parent RDD 做一遍整套的 Transformations。

  • Persistence : 持久化,對於一些常用的 RDD ,我們可以讓它保存在 Memory (cache),或是寫進資料儲存系統暫存,讓我們對此 RDD 做操作時不用,走一整趟的 Transformations 去產生它。

* 若沒有做 Persistence,每次呼叫 RDD 都會從它的源頭開始產生,而在這種情況下,一旦源頭的 RDD(例如存在 cluster 的某個檔案)出現更動或錯誤,便會導致 Error 發生。所以要善用 Persistence,並注意執行 JOB 時,你讀寫的檔案有沒有其他 JOB 在使用。

變數分享 :

Spark 支援兩種變數分享方式,一個是 Broadcast Variables,一個是 Accumulators。

  • Broadcast Variables : 透過 Broadcast 將變數存成 read-only 的序列化 cache 到每一個 Executor,當要執行該 task 的時候再反序列化。

    這意味著 Broadcast 有的應用情境在於

    • 有多個 stage 需要同樣的 data

    • 需要反序列化 Data 的時候。

  • Accumulators : 累加器,顧名思義它的用途在 '累加',並且可以平行使用,很適合做為 counter 或是 sums 的用途。(預設的 type 是數字)

Last updated