Spark:持久化存儲等級選取策略 /persist() / cache() /Storage Level

那麼我們應該如何選取持久化的存儲級別呢?

實際上存儲級別的選取就是Memory與CPU之間的雙重權衡,可以參考下述內容:

(1)如果RDD的數據量對於集羣內存容量壓力較小,可以很好地兼容默認存儲級別(MEMORY ONLY),那麼優先使用它,這是CPU工作最爲高效的種方式, 可以很好地提高運行速度。

(2)如果(1)不能滿足,即集羣的內存資源相較於cpu資源十分匱乏,則嘗試使用MEMORY_ ONLY_ SER,且選擇一種快速 的序列化工具,也可以達到一種不錯的效果。

(3)一般情況下不要把數據持久化到磁盤, 除非計算是非常“昂貴”的或者計算過程會過濾掉大量數據,因爲重新計算一個 分區數據的速度可能要高於從磁盤讀取一個分區數據的速度。

(4)如果需要快速的失敗恢復機制,則使用備份的存儲級別,如MEMORY_ONLY_2.MEMORY_AND_DISK_2;雖然所有的存儲級別都可以通過重新計算丟失的數據實現容錯,但是備份機制使得大部分情況下應用無須中斷,即數據丟失情況下,直接使用備份數據,而不需要重新計算數據的過程;

(5)如果處於大內存或多應用的場景下,OFF_ HEAP可以帶來以下的好處:

它允許Spark Executors可以共享Tachyon的內存數據;

它在很大程度上減少JVM垃圾回收帶來的性能開銷;

Spark Executors故障不會導致數據丟失。

如果要緩存的數據太多,內存中放不下,Spark 會自動利用最近最少使用(LRU)的緩存策略把最老的分區從內存中移除。對於僅把數據存放在內存中的緩存級別,下一次要用到已經被移除的分區時,這些分區就需要重新計算。但是對於使用內存與磁盤的緩存級別的分區來說,被移除的分區都會寫入磁盤。不論哪種情況,都不必擔心你的作業因 爲緩存了太多數據而被打斷。不過,緩存不必要的數據會導致有用的數據被移出內存,帶來更多重算的時間開銷。最後,RDD還有一個方法叫作unpersist(), 調用該方法可以手動把持久化的RDD從緩存中移除。

 

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