spark(三)緩存與checkpoint

一、應用場景

  • 緩存:將rdd所需的數據緩存到Executor的內存中,主要用於空間換時間,如某個spark任務期望執行時間在xx以內,目前達不到,此時在內存充足的情況下可以查看是否有重複利用的rdd數據,可以對該數據進行cache
  • checkpoint:主要用於任務容錯,比如機器學習進行迭代式計算,需要計算10小時才能出結果,如果在第9個小時任務出錯,重新提交需要重新跑所有數據。可以在某些節點對數據進行checkpoint

二、緩存

cache和persist都是用於將一個RDD進行緩存,這樣在之後使用的過程中就不需要重新計算,可以大大節省程序運行時間。
unpersist():清除緩存方法。
cache和persist的區別:cache只有一個默認的緩存級別MEMORY_ONLY,而persist可以根據情況設置其它的緩存級別。
RDD的緩存級別:

object StorageLevel {
  val NONE = new StorageLevel(false, false, false, false)
  val DISK_ONLY = new StorageLevel(true, false, false, false)
  val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
  val MEMORY_ONLY = new StorageLevel(false, true, false, true)
  val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
  val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
  val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
  val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
  val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
  val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
  val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
  val OFF_HEAP = new StorageLevel(false, false, true, false)
  ......
}

主要包含5各參數:

  • useDisk:使用硬盤(外存)
  • useMemory:使用內存
  • useOffHeap:使用堆外內存,這是Java虛擬機裏面的概念,堆外內存意味着把內存對象分配在Java虛擬機的堆以外的內存,這些內存直接受操作系統管理(而不是虛擬機)。這樣做的結果就是能保持一個較小的堆,以減少垃圾收集對應用的影響。
  • deserialized:反序列化,其逆過程序列化(Serialization)是java提供的一種機制,將對象表示成一連串的字節;而反序列化就表示將字節恢復爲對象的過程。序列化是對象永久化的一種機制,可以將對象及其屬性保存起來,並能在反序列化後直接恢復這個對象
  • replication:備份數(在多個節點上備份)

三、checkpoint

sc.sparkContext.setCheckpointDir('hdfs://...')
......
......
rdd.cache()
rdd.checkpoint()
......

checkpoint接口是將RDD持久化到HDFS中,與persist的區別是checkpoint會切斷此RDD之前的依賴關係,而persist會保留依賴關係。checkpoint的兩大作用:一是spark程序長期駐留,過長的依賴會佔用很多的系統資源,定期checkpoint可以有效的節省資源;二是維護過長的依賴關係可能會出現問題,一旦spark程序運行失敗,RDD的容錯成本會很高。

注意:checkpoint執行前先進行cache,避免兩次計算(如collect和checkpoint會生成兩個任務把前面的數據都計算一遍),也不是一定要進行cache,看具體情況定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章