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