1. 功能本質
persist:這是一個通用的持久化方法,能夠指定多種不同的存儲級別。存儲級別決定了數據的存儲位置(如內存、磁盤)以及存儲形式(如是否序列化)。
2. 存儲級別指定
persist:可以通過傳入 StorageLevel 參數來指定不同的持久化級別。常見的持久化級別有:
MEMORY_ONLY:將 RDD 以 Java 對象的形式存儲在 JVM 的內存中。若內存不足,部分分區將不會被緩存,需要時會重新計算。
MEMORY_AND_DISK:優先把 RDD 以 Java 對象的形式存儲在 JVM 的內存中。若內存不足,會把多余的分區存儲到磁盤上。
DISK_ONLY:將 RDD 的數據存儲在磁盤上。
MEMORY_ONLY_SER:將 RDD 以序列化的 Java 對象形式存儲在內存中,相較于 MEMORY_ONLY,序列化后占用的內存空間更小,但讀取時需要進行反序列化操作,會帶來一定的性能開銷。
MEMORY_AND_DISK_SER:優先將 RDD 以序列化的 Java 對象形式存儲在內存中,內存不足時存儲到磁盤上。
cache:不能指定存儲級別,它固定使用 MEMORY_ONLY 存儲級別。
3.persist的示例
下面我們以DISK_ONLY為例,改寫上面的程序,驗證它的持久化效果。具體要改動的地方有兩個: 指定持久化地址; 把cache改成persist;
conf.set("spark.local.dir", "/path/to/your/local/dir")
sc = SparkContext(conf)
val cachedRDD = largeRDD.map(complexTransformation).persist(StorageLevel.MEMORY_ONLY)
4.?persist()
?的核心優勢
-
靈活性:可根據數據大小、集群資源選擇最優存儲策略。
-
性能優化:
-
內存充足時用?
MEMORY_ONLY
?避免磁盤 IO。 -
內存不足時用?
MEMORY_AND_DISK
?避免頻繁重計算。
-
-
資源平衡:通過序列化(如?
MEMORY_ONLY_SER
)減少內存占用,降低 OOM 風險。
5. 何時使用?persist()
?
適用場景
-
迭代算法:如機器學習中的梯度下降、圖計算的 PageRank。
-
多階段計算:同一數據集被多次用于不同操作(如過濾、聚合、JOIN)。
-
交互式分析:在 Spark Shell 或 Notebook 中多次查詢同一數據集。
不適用場景
-
數據僅使用一次:緩存反而浪費資源。
-
存儲成本高于計算成本:如數據極大且后續操作簡單。