更新時(shí)間:2023-02-23 來(lái)源:黑馬程序員 瀏覽量:
RDD之間進(jìn)行相互迭代計(jì)算(Transformation的轉(zhuǎn)換),當(dāng)執(zhí)行開啟后,新RDD的生成,代表老RDD的消失。RDD的數(shù)據(jù)是過(guò)程數(shù)據(jù),只在處理的過(guò)程中存在,一旦處理完成,就不見了。這個(gè)特性可以最大化的利用資源,老舊RDD沒(méi)用了就從內(nèi)存中清理,給后續(xù)的計(jì)算騰出內(nèi)存空間。
例如上圖,rd3被2次使用,第一次使用之后,其實(shí)RDD3就不存在了.第二次用的時(shí)候,只能基于RDD的血緣關(guān)系,從RDD1重新執(zhí)行,構(gòu)建出來(lái)RDD3,供RDD5使用。
上述的場(chǎng)景,肯定要執(zhí)行優(yōu)化,優(yōu)化就是:RDD3如果不消失,那么RDD1→RDD2→RDD3這個(gè)鏈條就不會(huì)執(zhí)行2次,或者更多次RDD的緩存技術(shù):Spark提供了緩存API,可以讓我們通過(guò)調(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個(gè)副本 rdd3.persist(StorageLevel.DISK_ONLY) #僅緩存硬盤上 rdd3.persist(StorageLeveL.DISK_ONLY_2) #僅緩存硬盤上,2個(gè)副本 rdd3.Dtrsist (StorageLevet.DISK_ONLY_3) #僅緩存硬盤上,3個(gè)副本 rdd3.per sist(StorageLeveL.MEMORY_AND_DISK) #先放內(nèi)存,不夠放硬盤 rdd3.persist(StorageLeve1.MEMORY_AND_DISK_2)#先放內(nèi)存,不夠放硬盤,2個(gè)副本 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 #主動(dòng)清理緩存的API rdd.unpersist()
RDD緩存特點(diǎn)
緩存技術(shù)可以將過(guò)程RDD數(shù)據(jù),持久化保存到內(nèi)存或者硬盤上。
但是,這個(gè)保存在設(shè)定上是認(rèn)為不安全的,緩存的數(shù)據(jù)在設(shè)計(jì)上是認(rèn)為有丟失風(fēng)險(xiǎn)的。所以,緩存有一個(gè)特點(diǎn)就是:其保留RDD之間的血緣(依賴)關(guān)系,一旦緩存丟失,可以基于血緣關(guān)系的記錄,重新計(jì)算這個(gè)RDD的數(shù)據(jù)。
緩存如何丟失:在內(nèi)存中的緩存是不安全的,比如斷電\計(jì)算任務(wù)內(nèi)存不足,把緩存清理給計(jì)算讓路,硬盤中因?yàn)橛脖P損壞也是可能丟失的。
RDD緩存的保存過(guò)程: