Spark(Persist)

RDD的持久化

可以使用persist(StorageLevel)或者cache()方法,數據會在第一次計算後緩存在各節點的內存裏
Spark的緩存具有容錯機制,如果RDD中的任何一個緩存分區丟失,Spark會按照原來的計算過程自動地重新計算並緩存。
在shuffle操作中(例如reduceByKey),即便用戶沒有調用persist方法,Spark也會自動緩存部分中間數據。
這樣做的目的是,在shuffle過程中如果某個節點計算異常,則不需要重新計算全部的輸入數據。
如果用戶想多次使用某個RDD,仍然建議調用persist方法去持久化RDD


Java/Scala RDD的持久化

每個持久化的RDD可以使用不同的存儲方式進行緩存,例如,持久化到磁盤、序列化的Java對象到內存(節省空間)、跨節點複製。
這些存儲方式可以通過persist(StorageLevel)方法設置。cache()方法是使用默認存儲方式StorageLevel.MEMORY_ONLY的快捷方法(將反序列化的對象存儲到內存中)。
可用的存儲方式:
    MEMORY_ONLY 將RDD以反序列化Java對象的形式保存在JVM。如果內存空間不夠,不能緩存在內存裏面的某些分區數據會在需要使用時重新進行計算。這是默認的方式
    MEMORY_AND_DISK 將RDD以反序列化Java對象的形式保存在JVM。如果內存空間不夠,把不能緩存的分區數據保存到磁盤,在需要使用時從磁盤讀取
    MEMORY_ONLY_SER 將RDD以序列化的Java對象的形式保存在JVM中(每個分區爲一個byte數組)。這種方式會比反序列化對象節省空間,
特別是在使用快速序列化器(fast serializer)時會節省更多的空間,但是在讀取時會增加CPU的使用率
    MEMORY_AND_DISK_SER 與MEMORY_ONLY_SER類似,但會把不能緩存的分區數據保存到磁盤,而不是在需要使用時重新進行計算
    DISK_ONLY 將RDD以反序列化Java對象的形式保存在磁盤
    
    MEMORY_ONLY_2,MEMORY_AND_DISK_2,MEMORY_ONLY_SER_2,MEMORY_AND_DISK_SER_2,DISK_ONLY_2 與上述方式一樣,
但同時會對每一個分區數據在集羣的兩個節點上創建副本

    OFF_HEAP (試驗性功能) 與MEMORY_ONLY_SER類似,但會把分區數據保存到堆外內存(off-heap memory)。該方式需要啓用堆外內存


Python RDD的持久化

在Python中,不管你是否選擇了序列化的方式,緩存的對象總是使用Pickle庫進行序列化。
可用的存儲方式:
    MEMORY_ONLY
    MEMORY_AND_DISK
    DISK_ONLY
    
    MEMORY_ONLY_2, MEMORY_AND_DISK_2, DISK_ONLY_2 與上述方式一樣,但同時會對每一個分區數據在集羣的兩個節點上創建副本


RDD的刪除

Spark會自動監控各個節點的緩存使用率,並根據最少使用的算法(LRU)將舊數據刪除。
如果想手動移除一個RDD而不是等待該RDD被Spark自動移除,可以使用RDD.unpersist()方法

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章