(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
使用不同參數(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í)行原理:
- 當(dāng)RDD的job執(zhí)行完畢后,會(huì)從finalRDD從后往前回溯
- 當(dāng)回溯到調(diào)用了checkpoint()方法的RDD后佩研,會(huì)給這個(gè)RDD做一個(gè)標(biāo)記
- Spark框架自動(dòng)啟動(dòng)一個(gè)新的job,計(jì)算這個(gè)RDD的數(shù)據(jù)霞揉,然后把數(shù)據(jù)持久化到HDFS上
- 優(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ō)明
- 這3個(gè)算子都是Transformations類算子隶症,需要Actions類算子觸發(fā)才能執(zhí)行
- cache 和 persist 算子的返回執(zhí)行必須賦值給一個(gè)變量政模,在接下來(lái)的job中直接使用這個(gè)變量,那么就是使用了持久化的數(shù)據(jù)了蚂会,如果application中只有一個(gè)job淋样,沒(méi)有必要使用RDD持久化
- cache 和 persist 算子后不能立即緊跟action類算子,比如count算子胁住,但是在下一行可以有action類算子
error :
cache().count()
right :
rdd = rdd.cache()
rdd.count()
- 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ì)方便很多碉碉。 - checkpoint持久化到磁盤和persist持久化到磁盤的區(qū)別
- persist()把RDD持久化到磁盤柴钻,這個(gè)RDD的持久化數(shù)據(jù)保存在Worker的工作目錄下,且當(dāng)整個(gè)application執(zhí)行結(jié)束后垢粮,就會(huì)自動(dòng)刪除持久化的數(shù)據(jù)
- checkpoint()持久化到指定的目錄贴届,可以是HDFS,而且永久保存