spark中cache()蔽莱、persist()弟疆、checkpoint()解析

“夫唯兵者,不祥之器盗冷,物或惡之怠苔,故有道者不處。
君子居則貴左仪糖,用兵則貴右柑司。
兵者不祥之器迫肖,非君子之器,不得已而用之攒驰,恬淡為上蟆湖。
勝而不美,而美之者玻粪,是樂殺人隅津。
夫樂殺人者,則不可得志于天下矣劲室。
吉事尚左伦仍,兇事尚右。
偏將軍居左很洋,上將軍居右充蓝,言以喪禮處之。
殺人之眾蹲缠,以悲哀泣之棺克,戰(zhàn)勝以喪禮處之∠叨ǎ”[1]

Spark對RDD的持久化操作(cache()娜谊、persist()checkpoint())是很重要的斤讥,可以將rdd存放在不同的存儲介質中纱皆,方便后續(xù)的操作能重復使用。

cache()

persist()

cache和persist都是用于將一個RDD進行緩存芭商,這樣在之后使用的過程中就不需要重新計算派草,可以大大節(jié)省程序運行時間。
cache和persist的區(qū)別:cache只有一個默認的緩存級別MEMORY_ONLY铛楣,而persist可以根據(jù)情況設置其它的緩存級別近迁。
RDD的緩存級別:

查看 StorageLevel 類的源碼
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)
  ......
}

可以看到這里列出了12種緩存級別,但這些有什么區(qū)別呢簸州?可以看到每個緩存級別后面都跟了一個StorageLevel的構造函數(shù)鉴竭,里面包含了4個或5個參數(shù),如下:

val MEMORY_ONLY = new StorageLevel(false, true, false, true)

查看其構造函數(shù)
class StorageLevel private(
    private var _useDisk: Boolean,
    private var _useMemory: Boolean,
    private var _useOffHeap: Boolean,
    private var _deserialized: Boolean,
    private var _replication: Int = 1)
  extends Externalizable {
  ......
  def useDisk: Boolean = _useDisk
  def useMemory: Boolean = _useMemory
  def useOffHeap: Boolean = _useOffHeap
  def deserialized: Boolean = _deserialized
  def replication: Int = _replication
  ......
}

可以看到StorageLevel類的主構造器包含了5個參數(shù):

  • useDisk:使用硬盤(外存)
  • useMemory:使用內(nèi)存
  • useOffHeap:使用堆外內(nèi)存岸浑,這是Java虛擬機里面的概念搏存,堆外內(nèi)存意味著把內(nèi)存對象分配在Java虛擬機的堆以外的內(nèi)存,這些內(nèi)存直接受操作系統(tǒng)管理(而不是虛擬機)矢洲。這樣做的結果就是能保持一個較小的堆璧眠,以減少垃圾收集對應用的影響。
  • deserialized:反序列化,其逆過程序列化(Serialization)是java提供的一種機制责静,將對象表示成一連串的字節(jié)袁滥;而反序列化就表示將字節(jié)恢復為對象的過程。序列化是對象永久化的一種機制泰演,可以將對象及其屬性保存起來呻拌,并能在反序列化后直接恢復這個對象
  • replication:備份數(shù)(在多個節(jié)點上備份)

理解了這5個參數(shù),StorageLevel 的12種緩存級別就不難理解了睦焕。
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2) 就表示使用這種緩存級別的RDD將存儲在硬盤以及內(nèi)存中藐握,使用序列化(在硬盤中),并且在多個節(jié)點上備份2份(正常的RDD只有一份)

checkpoint()

sc.sparkContext.setCheckpointDir('...')
......
......
rdd.cache()
rdd.checkpoint()
......

checkpoint接口是將RDD持久化到HDFS中垃喊,與persist的區(qū)別是checkpoint會切斷此RDD之前的依賴關系猾普,而persist會保留依賴關系。checkpoint的兩大作用:一是spark程序長期駐留本谜,過長的依賴會占用很多的系統(tǒng)資源初家,定期checkpoint可以有效的節(jié)省資源;二是維護過長的依賴關系可能會出現(xiàn)問題乌助,一旦spark程序運行失敗溜在,RDD的容錯成本會很高。

注意:checkpoint執(zhí)行前要先進行cache他托,避免兩次計算掖肋。


  1. 老子《道德經(jīng)》第三十一章,老子故里赏参,中國鹿邑志笼。 ?

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市把篓,隨后出現(xiàn)的幾起案子纫溃,更是在濱河造成了極大的恐慌,老刑警劉巖韧掩,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紊浩,死亡現(xiàn)場離奇詭異,居然都是意外死亡疗锐,警方通過查閱死者的電腦和手機坊谁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窒悔,“玉大人,你說我怎么就攤上這事敌买〖蛑椋” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長聋庵。 經(jīng)常有香客問我膘融,道長,這世上最難降的妖魔是什么祭玉? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任氧映,我火速辦了婚禮,結果婚禮上脱货,老公的妹妹穿的比我還像新娘岛都。我一直安慰自己,他們只是感情好振峻,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布臼疫。 她就那樣靜靜地躺著,像睡著了一般扣孟。 火紅的嫁衣襯著肌膚如雪烫堤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天凤价,我揣著相機與錄音鸽斟,去河邊找鬼。 笑死利诺,一個胖子當著我的面吹牛富蓄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播立轧,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼格粪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氛改?” 一聲冷哼從身側響起帐萎,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胜卤,沒想到半個月后疆导,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡葛躏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年澈段,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舰攒。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡败富,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摩窃,到底是詐尸還是另有隱情兽叮,我是刑警寧澤芬骄,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站鹦聪,受9級特大地震影響账阻,放射性物質發(fā)生泄漏。R本人自食惡果不足惜泽本,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一淘太、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧规丽,春花似錦蒲牧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雄嚣,卻和暖如春晒屎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缓升。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工鼓鲁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人港谊。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓骇吭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親歧寺。 傳聞我的和親對象是個殘疾皇子燥狰,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容