更新時間:2022-12-09 來源:黑馬程序員 瀏覽量:
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使用。
上述的場景,肯定要執(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是將自己分區(qū)的數(shù)據(jù),每個分區(qū)自行將其數(shù)據(jù)保存在其所在的Executor內(nèi)存和硬盤上,這是分散存儲。