Spark之cache()和persist()
SuperBoy_LiangRDD的持久化也就是說假如我們從hdfs讀取文件,形成RDD。當我們對RDD進行持久化操作之後,
,然後再針對該RDD進行action操作(這裏我們假設執行count操作,中間可能經歷了一系列transformation操作),雖然第一次count()操作執行完了,但是也不會清除掉RDD中的數據,而是將其緩存在內存或者磁盤上。當第二次再執行count操作時,就不會重新從hdfs上讀取數據,形成新的RDD,而是直接從RDD所在的所有節點的緩存中直接讀取,對數據直接執行count操作,避免了重複計算。所以如果我們合理使用RDD的持久化機制,可以有效提高應用程序的性能。
從源碼來看調用cache()方法,內部調用persist()方法 :
def cache(): this.type = persist()
persist()方法的默認的sotrageLevel 是MEMORY_ONLY,所以cache()方法默認使用內存緩存。
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
def persist(newLevel: StorageLevel): this.type = {
// 如果用戶設置了checkpoint,我們需要覆蓋舊的storage level。
// checkpoint機制會將RDD的數據容錯到文件系統上(比如說
hdfs),如果在對RDD進行計算的時候,發現存儲的數據不在了,
會先找一下checkpoint數據,如果有就是用checkpoint的數據,就不
需要去計算了。
if (isLocallyCheckpointed){
persist(LocalRDDCheckpointData.transformStorageLevel(newLevel), allowOverride = true)
}else{
persist(newLevel, allowOverride = false)
}