天天看點

RDD的持久化

RDD 通過 Cache 或者 Persist 方法将前面的計算結果緩存,預設情況下會把資料以緩存在 JVM 的堆記憶體中。但是并不是這兩個方法被調用時立即緩存,而是觸發後面的 action 算子時,該 RDD 将會被緩存在計算節點的記憶體中,并供後面重用

存儲級别:

如果級别名字後面加上字尾_2,每個持久化的資料,都複制一份副本,并将副本儲存到其他節點上。 如果記憶體充足,要使用雙副本高可靠機制

緩存有可能丢失,或者存儲于記憶體的資料由于記憶體不足而被删除,RDD 的緩存容錯機制保證了即使緩存丢失也能保證計算的正确執行。通過基于 RDD 的一系列轉換,丢失的資料會被重算,由于 RDD 的各個Partition 是相對獨立的,是以隻需要計算丢失的部分即可,并不需要重算全部 Partition。

Spark 會自動對一些 Shuffle 操作的中間資料做持久化操作(比如:reduceByKey)。這樣做的目的是為了當一個節點 Shuffle 失敗了避免重新計算整個輸入。但是,在實際使用的時候,如果想重用資料,仍然建議調用 persist 或 cache。

将RDD的中間結果寫入次品,當血緣依賴過長時,會造成容錯成本過高

如果在中間階段做檢查點容錯,即:

如果檢查點之後有節點出現問題,可以從檢查點開始重做血緣,減少了開銷

對 RDD 進行 checkpoint 操作并不會馬上被執行,必須執行 Action 操作才能觸發

Cache 緩存隻是将資料儲存起來,不切斷血緣依賴。Checkpoint 檢查點切斷血緣依賴

Cache 緩存的資料通常存儲在磁盤、記憶體等地方,可靠性低。Checkpoint 的資料通常存,儲在 HDFS 等容錯、高可用的檔案系統,可靠性高。

建議對 checkpoint()的 RDD 使用 Cache 緩存,這樣 checkpoint 的 job 隻需從 Cache 緩存,中讀取資料即可,否則需要再從頭計算一次 RDD中讀取資料即可,否則需要再從頭計算一次 RDD