1. 程式人生 > >Spark RDD Cache快取使用詳解

Spark RDD Cache快取使用詳解

目錄:

1.概述
2.快取型別
3.如何選擇快取型別
4.移除快取資料

1.概述

Spark的開發調優有一個原則,即對多次使用的RDD進行持久化。如果要對一個RDD進行持久化,只要對這個RDD呼叫cache()和persist()即可。

1.1 cache()方法表示:使用非序列化的方式將RDD的資料全部嘗試持久化到記憶體中,cache()只是一個transformtion,是lazy的,必須通過一個action觸發,才能真正的將該RDD cache到記憶體中。
1.2 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,並不需要等待重新計算。(從另外的節點拿)

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

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