天天看點

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從緩存中移除。

繼續閱讀