首頁技術(shù)文章正文

為什么說RDD的數(shù)據(jù)是過程數(shù)據(jù)?RDD緩存

更新時間:2022-12-09 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

RDD之間進(jìn)行相互迭代計算(Transformation的轉(zhuǎn)換),當(dāng)執(zhí)行開啟后,新RDD的生成,代表老RDD的消失。RDD的數(shù)據(jù)是過程數(shù)據(jù),只在處理的過程中存在,一旦處理完成,就不見了。這個特性可以最大化的利用資源,老舊RDD沒用了就從內(nèi)存中清理,給后續(xù)的計算騰出內(nèi)存空間。

例如上圖,rd3被2次使用,第一次使用之后,其實RDD3就不存在了.第二次用的時候,只能基于RDD的血緣關(guān)系,從RDD1重新執(zhí)行,構(gòu)建出來RDD3,供RDD5使用。
RDD數(shù)據(jù)

上述的場景,肯定要執(zhí)行優(yōu)化,優(yōu)化就是:RDD3如果不消失,那么RDD1→RDD2→RDD3這個鏈條就不會執(zhí)行2次,或者更多次RDD的緩存技術(shù):Spark提供了緩存API,可以讓我們通過調(diào)用APl,將指定的RDD數(shù)據(jù)保留在內(nèi)存或者硬盤上緩存的API。

#RDD3被2次使用,可以加入緩存進(jìn)行優(yōu)化
rdd3.cache()#緩存到內(nèi)存中.
rdd3.persist(StorageLevel.MEMORY_ONLY)      #僅內(nèi)存緩存
rdd3.persist(StorageLevel.MEMORY_ONLY_2)    #僅內(nèi)存緩存,2個副本
rdd3.persist(StorageLevel.DISK_ONLY)        #僅緩存硬盤上
rdd3.persist(StorageLeveL.DISK_ONLY_2)      #僅緩存硬盤上,2個副本
rdd3.Dtrsist (StorageLevet.DISK_ONLY_3)     #僅緩存硬盤上,3個副本
rdd3.per sist(StorageLeveL.MEMORY_AND_DISK) #先放內(nèi)存,不夠放硬盤
rdd3.persist(StorageLeve1.MEMORY_AND_DISK_2)#先放內(nèi)存,不夠放硬盤,2個副本
rdd3.persist(StorageLevel.OFF_HEAP)         #堆外內(nèi)存(系統(tǒng)內(nèi)存)
#如上API,自行選擇使用即可
#一般建議使用rdd3.persist(StorageLevel.MEMORY_AND_DISK)
#如果內(nèi)存比較小的集群,建議使用rdd3.persist(StorageLevel.DISK_ONLY)或者就別用緩存了用CheckPoint

#主動清理緩存的API
rdd.unpersist()

RDD緩存特點

緩存技術(shù)可以將過程RDD數(shù)據(jù),持久化保存到內(nèi)存或者硬盤上。

但是,這個保存在設(shè)定上是認(rèn)為不安全的,緩存的數(shù)據(jù)在設(shè)計上是認(rèn)為有丟失風(fēng)險的。所以,緩存有一個特點就是:其保留RDD之間的血緣(依賴)關(guān)系,一旦緩存丟失,可以基于血緣關(guān)系的記錄,重新計算這個RDD的數(shù)據(jù)。

緩存如何丟失:在內(nèi)存中的緩存是不安全的,比如斷電\計算任務(wù)內(nèi)存不足,把緩存清理給計算讓路,硬盤中因為硬盤損壞也是可能丟失的。

RDD緩存的保存過程:

RDD緩存保存過程

如圖,RDD是將自己分區(qū)的數(shù)據(jù),每個分區(qū)自行將其數(shù)據(jù)保存在其所在的Executor內(nèi)存和硬盤上,這是分散存儲。





分享到:
在線咨詢 我要報名
和我們在線交談!