Spark調優的關鍵—RDD Cache緩存使用詳解

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

Spark调优的关键—RDD Cache缓存使用详解

3.如何選擇存儲級別

如果RDD對於默認的存儲級別是滿足的,就不要選擇其他了。這是性能最優的,最高效的(前提內存要足夠,這是第一選擇)

如果MEMORY_ONLY不一定滿足(即:內存不夠),可以嘗試使用MEMORY_ONLY_SER再加上一個序列化框架(kyro),這樣內存的空間更好。序列化就是為了減少空間

不要把數據寫到磁盤,成本是非常高的。當數據太大的時候,可以過濾一部分數據再存,這樣的話可能會更快

可以使用副本的存儲級別能更快的容錯,所以的storage level都提供了副本機制,這個機制能讓你繼續再RDD上運行task,並不需要等待重新計算。(從另外的節點拿)

************************首選第1種方式,滿足不了再使用第2種。後兩種不推薦

4.移除緩存數據

Spark會自動地監控每個節點的使用情況,以一種LRU的機制(least-recently-used:最近很少使用)去自動移除。如果想手工代替這種自動去移除,可以使用RDD.unpersist去處理


分享到:


相關文章: