Spark-RDD持久化

(1) persist算子

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

  • StorageLevel說(shuō)明:

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持久化的級(jí)別:

image.png

使用不同參數(shù)的組合構(gòu)造的實(shí)例被預(yù)先定義為一些值,比如MEMORY_ONLY代表著不存入磁盤,存入內(nèi)存,不使用堆外內(nèi)存,不進(jìn)行序列化,副本數(shù)為1,使用persisit()方法時(shí)把這些持久化的級(jí)別作為參數(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)化:對(duì)某個(gè)RDD執(zhí)行checkpoint()之前,對(duì)該RDD執(zhí)行cache(),這樣的話,新啟動(dòng)的job只需要把內(nèi)存中的數(shù)據(jù)上傳到HDFS中即可,不需要重新計(jì)算。

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

  1. 這3個(gè)算子都是Transformations類算子,需要Actions類算子觸發(fā)才能執(zhí)行
  2. cache 和 persist 算子的返回執(zhí)行必須賦值給一個(gè)變量,在接下來(lái)的job中直接使用這個(gè)變量,那么就是使用了持久化的數(shù)據(jù)了,如果application中只有一個(gè)job,沒(méi)有必要使用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)很長(zhǎng),如果中間某個(gè)RDD的數(shù)據(jù)丟失,還需要重新從頭計(jì)算,如果對(duì)中間某個(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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 曾經(jīng)我夢(mèng)想像武俠小說(shuō)中的英雄一樣浪跡天涯,曾經(jīng)我渴望一夜暴富,從此不再為錢而煩惱,曾經(jīng)我被最好的朋友欺騙,曾經(jīng)?當(dāng)...
    香水佬閱讀 322評(píng)論 0 1
  • 茫茫塵世杳杳如夢(mèng) 我如花笑靨開(kāi)遍浩瀚宇宙 在每一個(gè)心起的剎那 都如初見(jiàn)
    片月生海閱讀 220評(píng)論 0 0
  • 4月8日下午,山東創(chuàng)新教育研究院院務(wù)工作擴(kuò)大會(huì)議暨縣域教育聯(lián)盟啟動(dòng)會(huì)議在青島市黃島區(qū)雙語(yǔ)小學(xué)順利召開(kāi)。山東省教...
    光陰_bd7e閱讀 490評(píng)論 0 0

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