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