重點:RDD的緩存


概述

相比Hadoop MapReduce來說,Spark計算具有巨大的性能優勢,其中很大一部分原因是Spark對於內存的充分利用,以及提供的緩存機制。

   

RDD持久化(緩存)

持久化在早期被稱作緩存(cache),但緩存一般指將內容放在內存中。雖然持久化操作在絕大部分情況下都是將RDD緩存在內存中,但一般都會在內存不夠時用磁盤頂上去(比操作系統默認的磁盤交換性能高很多)。當然,也可以選擇不使用內存,而是僅僅保存到磁盤中。所以,現在Spark使用持久化(persistence)這一更廣泛的名稱。

   

如果一個RDD不止一次被用到,那么就可以持久化它,這樣可以大幅提升程序的性能,甚至達10倍以上。

   

默認情況下,RDD只使用一次,用完即扔,再次使用時需要重新計算得到,而持久化操作避免了這里的重復計算,實際測試也顯示持久化對性能提升明顯,這也是Spark剛出現時被人稱為內存計算框架的原因

   

假設首先進行了RDD0RDD1RDD2的計算作業,那么計算結束時,RDD1就已經緩存在系統中了。在進行RDD0RDD1RDD3的計算作業時,由於RDD1已經緩存在系統中,因此RDD0RDD1的轉換不會重復進行,計算作業只須進行RDD1RDD3的計算就可以了,因此計算速度可以得到很大提升。

   

   

持久化的方法是調用persist()函數,除了持久化至內存中,還可以在persist()中指定storage level參數使用其他的類型,具體如下:

   

1)MEMORY_ONLY : 將 RDD 以反序列化的 Java 對象的形式存儲在 JVM 中. 如果內存空間不夠,部分數據分區將不會被緩存,在每次需要用到這些數據時重新進行計算. 這是默認的級別。

   

cache()方法對應的級別就是MEMORY_ONLY級別

   

2)MEMORY_AND_DISK: RDD 以反序列化的 Java 對象的形式存儲在 JVM 中。如果內存空間不夠,將未緩存的數據分區存儲到磁盤,在需要使用這些分區時從磁盤讀取。

   

3)MEMORY_ONLY_SER : RDD 以序列化的 Java 對象的形式進行存儲(每個分區為一個 byte 數組)。這種方式會比反序列化對象的方式節省很多空間,尤其是在使用 fast serialize時會節省更多的空間,但是在讀取時會使得 CPU 的 read 變得更加密集。如果內存空間不夠,部分數據分區將不會被緩存,在每次需要用到這些數據時重新進行計算。

   

4)MEMORY_AND_DISK_SER :類似於 MEMORY_ONLY_SER ,但是溢出的分區會存儲到磁盤,而不是在用到它們時重新計算。如果內存空間不夠,將未緩存的數據分區存儲到磁盤,在需要使用這些分區時從磁盤讀取。

   

5)DISK_ONLY:只在磁盤上緩存 RDD。

   

6)MEMORY_ONLY_2,

MEMORY_AND_DISK_2, etc. :與上面的級別功能相同,只不過每個分區在集群中兩個節點上建立副本。

   

7)OFF_HEAP 將數據存儲在 off-heap memory 中。使用堆外內存,這是Java虛擬機里面的概念,堆外內存意味着把內存對象分配在Java虛擬機的堆以外的內存,這些內存直接受操作系統管理(而不是虛擬機)。使用堆外內存的好處:可能會利用到更大的內存存儲空間。但是對於數據的垃圾回收會有影響,需要程序員來處理

   

注意,可能帶來一些GC回收問題

   

Spark 也會自動持久化一些在 shuffle 操作過程中產生的臨時數據(比如 reduceByKey),即便是用戶並沒有調用持久化的方法。這樣做可以避免當 shuffle 階段時如果一個節點掛掉了就得重新計算整個數據的問題。如果用戶打算多次重復使用這些數據,我們仍然建議用戶自己調用持久化方法對數據進行持久化。

   

使用緩存

   

scala> import org.apache.spark.storage._

scala> val rdd1=sc.makeRDD(1 to 5)

scala> rdd1.cache //cache只有一種默認的緩存級別,即MEMORY_ONLY

scala> rdd1.persist(StorageLevel.MEMORY_ONLY)

   

緩存數據的清除

Spark 會自動監控每個節點上的緩存數據,然后使用 least-recently-used (LRU) 機制來處理舊的緩存數據。如果你想手動清理這些緩存的 RDD 數據而不是去等待它們被自動清理掉,

可以使用 RDD.unpersist( ) 方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM