天天看點

Spark之RDD的持久化SparkCore之RDD的持久化

SparkCore之RDD的持久化

持久化也是作為Spark程式的一個重要的優化手段

官網參考位址

Spark的最重要的功能特性之一就是持久化(persisting or caching),當你持久化一個RDD,每個節點都會存儲RDD的任何分區在記憶體中計算的資料并且對這些資料進行reuse重用,這樣可以使以後的操作更快,在spark中緩存時用于疊代和互動式使用的關鍵工具。

持久化的方式

spark的持久化的方式有2種:

一、persist() 可以選擇持久化的存儲級别

二、cache() 預設是持久化在記憶體中 StorageLevel.MEMORY_ONLY

每個持久化的RDD可以使用不同的存儲級别,可以選擇持久在磁盤上、記憶體中并作為序列化的Java對象在節點之間複制:

存儲級别

MEMORY_ONLY 将RDD作為反序列化的Java對象存儲在JVM中。如果RDD不能容納在記憶體中,則某些分區将不會被緩存,并且每次需要時都會進行動态重新計算。這是預設級别。
MEMORY_AND_DISK 将RDD作為反序列化的Java對象存儲在JVM中。如果RDD不能容納在記憶體中,會溢到磁盤中存儲,并在需要時從那裡讀取它們。
MEMORY_ONLY_SER (Java和Scala) 将RDD存儲為序列化的 Java對象(每個分區一個位元組數組)。通常,這比反序列化的對象更節省空間,尤其是在使用快速序列化程式時,但讀取時會占用 更多CPU。
MEMORY_AND_DISK_SER (Java和Scala) 與MEMORY_ONLY_SER類似,但是将記憶體中存不下的分區溢出到磁盤上,而不是在需要時即時對其進行重新計算。
DISK_ONLY 僅将RDD分區存儲在磁盤上。
MEMORY_ONLY_2,MEMORY_AND_DISK_2等。 與上面的級别相同,但是在兩個群集節點上複制每個分區。
OFF_HEAP(實驗性) 與MEMORY_ONLY_SER類似,但是将資料存儲在 堆外記憶體中。這需要啟用堆外記憶體。

如何選擇持久化的存儲級别

spark的存儲級别旨在記憶體使用率與CPU效率之間做一個權衡?

1、如果RDD資料量不大,那麼就可以選擇預設存儲級别:MEMORY_ONLY,這是CPU效率最高的選項

2、如果RDD不适用于MEMORY_ONLY,那麼可以使用MEMORY_ONLY_SER,以序列化的方式存儲RDD在記憶體中,減少記憶體的消耗,通常配合高效的序列化庫如[Kryo]進行使用

3、隻有在資料特别昂貴,我們才選擇MEMORY_AND_DISK,否則将會過濾掉大量的資料,也有可能讀取磁盤資料的時間與重新計算的時間一樣快

4、我們可手動

unpersist()

移除緩存數

=>>簡單的持久化代碼示意

val source: RDD[String] = sc.textFile("src/main/data/*.txt")

    //緩存RDD,避免重溯血緣關系,減少重複計算,提高複用性
    //1、以預設就有記憶體的反序列化Java對象存儲RDD
    source.cache()
    source.unpersist()
    //2、指定以序列化的方式進行存儲RDD
    source.persist(StorageLevel.MEMORY_ONLY_SER)
           

繼續閱讀