Spark之 cache()和persist()

×

Spark之cache()和persist()

SuperBoy_Liang

RDD的持久化也就是說假如我們從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)
   }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章