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