1.概述
Spark的開發調優有一個原則,即對多次使用的RDD進行持久化。如果要對一個RDD進行持久化,只要對這個RDD調用cache和persist即可。
cache方法表示:使用非序列化的方式將RDD的數據全部嘗試持久化到內存中,cache只是一個transformtion,是lazy的,必須通過一個action觸發,才能真正的將該RDD cache到內存中。
persist方法表示:手動選擇持久化級別,並使用指定的方式進行持久化。
2.緩存類型
NONE :什麼類型都不是
DISK_ONLY:磁盤
DISK_ONLY_2:磁盤;雙副本
MEMORY_ONLY: 內存;反序列化;把RDD作為反序列化的方式存儲,假如RDD的內容存不下,剩餘的分區在以後需要時會重新計算,不會刷到磁盤上。
MEMORY_ONLY_2:內存;反序列化;雙副本
MEMORY_ONLY_SER:內存;序列化;這種序列化方式,每一個partition以字節數據存儲,好處是能帶來更好的空間存儲,但CPU耗費高
MEMORY_ONLY_SER_2 : 內存;序列化;雙副本
MEMORY_AND_DISK:內存 + 磁盤;反序列化;雙副本;RDD以反序列化的方式存內存,假如RDD的內容存不下,剩餘的會存到磁盤
MEMORY_AND_DISK_2 : 內存 + 磁盤;反序列化;雙副本
MEMORY_AND_DISK_SER:內存 + 磁盤;序列化
MEMORY_AND_DISK_SER_2:內存 + 磁盤;序列化;雙副本
*********** 序列化能有效減少存儲空間,默認MEMORY_ONLY
3.如何選擇存儲級別
如果RDD對於默認的存儲級別是滿足的,就不要選擇其他了。這是性能最優的,最高效的(前提內存要足夠,這是第一選擇)
如果MEMORY_ONLY不一定滿足(即:內存不夠),可以嘗試使用MEMORY_ONLY_SER再加上一個序列化框架(kyro),這樣內存的空間更好。序列化就是為了減少空間
不要把數據寫到磁盤,成本是非常高的。當數據太大的時候,可以過濾一部分數據再存,這樣的話可能會更快
可以使用副本的存儲級別能更快的容錯,所以的storage level都提供了副本機制,這個機制能讓你繼續再RDD上運行task,並不需要等待重新計算。(從另外的節點拿)
************************首選第1種方式,滿足不了再使用第2種。後兩種不推薦
4.移除緩存數據
Spark會自動地監控每個節點的使用情況,以一種LRU的機制(least-recently-used:最近很少使用)去自動移除。如果想手工代替這種自動去移除,可以使用RDD.unpersist去處理
閱讀更多 中國存儲 的文章