RDD持久化

Spark通過在操作中將其持久保存在內存中,提供了一種處理數據集的便捷方式。在持久化RDD的同時,每個節點都存儲它在內存中計算的任何分區。也可以在該數據集的其他任務中重用它們。

我們可以使用persist()cache()方法來標記要保留的RDD。Spark的緩存是容錯的。在任何情況下,如果RDD的分區丟失,它將使用最初創建它的轉換自動重新計算。

存在可用於存儲持久RDD的不同存儲級別。通過將StorageLevel對象(Scala,Java,Python)傳遞給persist()來使用這些級別。但是,cache()方法用於默認存儲級別,即StorageLevel.MEMORY_ONLY

以下是存儲級別的集合:

存儲級別

描述

MEMORY_ONLY

它將RDD存儲爲JVM中的反序列化Java對象。這是默認級別。如果RDD不適合內存,則每次需要時都不會緩存和重新計算某些分區。

MEMORY_AND_DISK

它將RDD存儲爲JVM中的反序列化Java對象。如果RDD不適合內存,請存儲不適合磁盤的分區,並在需要時從那裏讀取它們。

MEMORY_ONLY_SER

它將RDD存儲爲序列化Java對象(即每個分區一個字節的數組)。這通常比反序列化的對象更節省空間。

MEMORY_AND_DISK_SER

它類似於MEMORY_ONLY_SER,但是將內存中不適合的分區溢出到磁盤而不是重新計算它們。

DISK_ONLY

它僅將RDD分區存儲在磁盤上。

MEMORY_ONLY_2, MEMORY_AND_DISK_2

它與上面的級別相同,但複製兩個羣集節點上的每個分區。

OFF_HEAP

它類似於MEMORY_ONLY_SER,但將數據存儲在堆外內存中。必須啓用堆外內存。