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,但將資料儲存在堆外記憶體中。必須啟用堆外記憶體。