Spark-RDD持久化

(1) persist算子

  • 使用方法:
var rdd = sc.textFile("test")
rdd = rdd.persist(StorageLevel.MEMORY_ONLY)
val count = rdd.count() //或者其他操作

  • StorageLevel說明:

StorageLevel的構(gòu)造函數(shù):

class StorageLevel private(
    private var _useDisk: Boolean, # 是否存入磁盤
    private var _useMemory: Boolean, # 是否存入內(nèi)存
    private var _useOffHeap: Boolean, # 是否使用堆外內(nèi)存
    private var _deserialized: Boolean, # 是否不進(jìn)行序列化
    private var _replication: Int = 1 # 副本數(shù)(默認(rèn)為1))

StorageLevel object中已經(jīng)定義了幾種代表RDD持久化的級別:

image.png

使用不同參數(shù)的組合構(gòu)造的實(shí)例被預(yù)先定義為一些值,比如MEMORY_ONLY代表著不存入磁盤,存入內(nèi)存,不使用堆外內(nèi)存,不進(jìn)行序列化,副本數(shù)為1,使用persisit()方法時(shí)把這些持久化的級別作為參數(shù)傳入即可。

(2) cache算子

cache() = persist(StorageLevel.MEMORY_ONLY)

(3) checkpoint算子:可以把RDD持久化到HDFS

使用方法:

使用方法:
sc.setCheckpointDir("hdfs://...")
var rdd = sc.textFile("test")
rdd.checkpoint()
val count = rdd.count() //或者其他操作

checkpoint()執(zhí)行原理:

  1. 當(dāng)RDD的job執(zhí)行完畢后,會(huì)從finalRDD從后往前回溯
  2. 當(dāng)回溯到調(diào)用了checkpoint()方法的RDD后,會(huì)給這個(gè)RDD做一個(gè)標(biāo)記
  3. Spark框架自動(dòng)啟動(dòng)一個(gè)新的job,計(jì)算這個(gè)RDD的數(shù)據(jù),然后把數(shù)據(jù)持久化到HDFS上
  4. 優(yōu)化:對某個(gè)RDD執(zhí)行checkpoint()之前,對該RDD執(zhí)行cache(),這樣的話,新啟動(dòng)的job只需要把內(nèi)存中的數(shù)據(jù)上傳到HDFS中即可,不需要重新計(jì)算。

(4) 關(guān)于這3個(gè)算子的幾點(diǎn)說明

  1. 這3個(gè)算子都是Transformations類算子,需要Actions類算子觸發(fā)才能執(zhí)行
  2. cache 和 persist 算子的返回執(zhí)行必須賦值給一個(gè)變量,在接下來的job中直接使用這個(gè)變量,那么就是使用了持久化的數(shù)據(jù)了,如果application中只有一個(gè)job,沒有必要使用RDD持久化
  3. cache 和 persist 算子后不能立即緊跟action類算子,比如count算子,但是在下一行可以有action類算子
error : 
    cache().count()  
right : 
    rdd = rdd.cache()   
    rdd.count()

  1. checkpoint()算子執(zhí)行后就切斷了RDD之間的依賴
    當(dāng)業(yè)務(wù)邏輯很復(fù)雜時(shí),RDD之間頻繁轉(zhuǎn)換,RDD的血統(tǒng)很長,如果中間某個(gè)RDD的數(shù)據(jù)丟失,還需要重新從頭計(jì)算,如果對中間某個(gè)RDD調(diào)用了checkpoint()方法,把這個(gè)RDD上傳到HDFS,同時(shí)讓后面的RDD不再依賴于這個(gè)RDD,而是依賴于HDFS上的數(shù)據(jù),那么下次計(jì)算會(huì)方便很多。
  2. checkpoint持久化到磁盤和persist持久化到磁盤的區(qū)別
  • persist()把RDD持久化到磁盤,這個(gè)RDD的持久化數(shù)據(jù)保存在Worker的工作目錄下,且當(dāng)整個(gè)application執(zhí)行結(jié)束后,就會(huì)自動(dòng)刪除持久化的數(shù)據(jù)
  • checkpoint()持久化到指定的目錄,可以是HDFS,而且永久保存
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (1) persist算子 使用方法: StorageLevel說明: StorageLevel的構(gòu)造函數(shù): St...
    小豬Harry閱讀 260評論 0 0
  • (1) persist算子 使用方法: StorageLevel說明: StorageLevel的構(gòu)造函數(shù): St...
    piziyang12138閱讀 333評論 0 0
  • (1) persist算子 使用方法: StorageLevel說明: StorageLevel的構(gòu)造函數(shù): St...
    CoderJed閱讀 329評論 0 0
  • 我們這節(jié)課講一下RDD的持久化 這段代碼我們上午已經(jīng)看過了,有瑕疵大家看出來了嗎?有什么瑕疵啊?大家是否還記得我在...
    Albert陳凱閱讀 755評論 0 2
  • 今晚的月亮有點(diǎn)暖 匆忙忙的旅人啊 汗水滴落塵埃 生出了一汪湖沼 連成的海 孫陸辰 于2018.1.
    孫陸辰閱讀 145評論 0 1

友情鏈接更多精彩內(nèi)容