rdd的全稱為Resilient Distributed Datasets(彈性分布式數(shù)據(jù)集)
rdd的操作有兩種transfrom和action。
transfrom并不引發(fā)真正的rdd計(jì)算,action才會(huì)引發(fā)真正的rdd計(jì)算敬扛。
rdd的持久化是便于rdd計(jì)算的重復(fù)使用晰洒。
在rdd參與第一次計(jì)算后,設(shè)置rdd的存儲(chǔ)級(jí)別可以保持rdd計(jì)算后的值在內(nèi)存中啥箭。(1)另外谍珊,只有未曾設(shè)置存儲(chǔ)級(jí)別的rdd才能設(shè)置存儲(chǔ)級(jí)別,設(shè)置了存儲(chǔ)級(jí)別的rdd不能修改其存儲(chǔ)級(jí)別急侥。(2)(1)的舉例如下:rdd1要經(jīng)過transform1得到rdd2,然后在一個(gè)循環(huán)L內(nèi)rdd2進(jìn)行transform2和action1砌滞。由于trasform操作是不會(huì)真正執(zhí)行的,所以rdd1執(zhí)行transform1需要在循環(huán)L第一次循環(huán)的時(shí)候觸發(fā)坏怪。如果設(shè)置了rdd1的存儲(chǔ)級(jí)別贝润,那么循環(huán)L的第二次循環(huán)起,只需要從rdd2開始計(jì)算就好了铝宵,而不用向第一次循環(huán)時(shí)從rdd1開始計(jì)算题暖。
rdd的持久化操作有cache()和presist()函數(shù)這兩種方式。
Spark最重要的一個(gè)功能捉超,就是在不同操作間胧卤,持久化(或緩存)一個(gè)數(shù)據(jù)集在內(nèi)存中。當(dāng)你持久化一個(gè)RDD拼岳,每一個(gè)結(jié)點(diǎn)都將把它的計(jì)算分塊結(jié)果保存在內(nèi)存中枝誊,并在對(duì)此數(shù)據(jù)集(或者衍生出的數(shù)據(jù)集)進(jìn)行的其它動(dòng)作中重用。這將使得后續(xù)的動(dòng)作(Actions)變得更加迅速(通诚е剑快10倍)叶撒。緩存是用Spark構(gòu)建迭代算法的關(guān)鍵。你可以用persist()或cache()方法來標(biāo)記一個(gè)要被持久化的RDD耐版,然后一旦首次被一個(gè)動(dòng)作(Action)觸發(fā)計(jì)算祠够,它將會(huì)被保留在計(jì)算結(jié)點(diǎn)的內(nèi)存中并重用。Cache有容錯(cuò)機(jī)制粪牲,如果RDD的任一分區(qū)丟失了古瓤,通過使用原先創(chuàng)建它的轉(zhuǎn)換操作,它將會(huì)被自動(dòng)重算(不需要全部重算腺阳,只計(jì)算丟失的部分)落君。當(dāng)需要?jiǎng)h除被持久化的RDD,可以用unpersistRDD()來完成該工作亭引。此外绎速,每一個(gè)RDD都可以用不同的保存級(jí)別進(jìn)行保存,從而允許你持久化數(shù)據(jù)集在硬盤焙蚓,或者在內(nèi)存作為序列化的Java對(duì)象(節(jié)省空間)纹冤,甚至于跨結(jié)點(diǎn)復(fù)制洒宝。這些等級(jí)選擇,是通過將一個(gè)org.apache.spark.storage.StorageLevel對(duì)象傳遞給persist()方法進(jìn)行確定萌京。cache()方法是使用默認(rèn)存儲(chǔ)級(jí)別的快捷方法待德,也就是StorageLevel.MEMORY_ONLY(將反序列化的對(duì)象存入內(nèi)存)。
StorageLevel有五個(gè)屬性枫夺,
分別是:useDisk_是否使用磁盤将宪,
useMemory_是否使用內(nèi)存,
useOffHeap_是否使用堆外內(nèi)存如:Tachyon橡庞,
deserialized_是否進(jìn)行反序列化较坛,
replication_備份數(shù)目。
存儲(chǔ)級(jí)別的選擇
Spark的不同存儲(chǔ)級(jí)別扒最,旨在滿足內(nèi)存使用和CPU效率權(quán)衡上的不同需求丑勤。我們建議通過以下的步驟來進(jìn)行選擇:
?如果你的RDDs可以很好的與默認(rèn)的存儲(chǔ)級(jí)別(MEMORY_ONLY)契合,就不需要做任何修改了吧趣。這已經(jīng)是CPU使用效率最高的選項(xiàng)法竞,它使得RDDs的操作盡可能的快。?如果不行强挫,試著使用MEMORY_ONLY_SER并且選擇一個(gè)快速序列化的庫使得對(duì)象在有比較高的空間使用率的情況下岔霸,依然可以較快被訪問。
?
盡可能不要存儲(chǔ)到硬盤上俯渤,除非計(jì)算數(shù)據(jù)集的函數(shù)呆细,計(jì)算量特別大,或者它們過濾
了大量的數(shù)據(jù)八匠。否則絮爷,重新計(jì)算一個(gè)分區(qū)的速度,和與從硬盤中讀取基本差不多快梨树。
總結(jié):調(diào)用persist()或cache()方法使用的是MEMORY_ONLY存儲(chǔ)級(jí)別坑夯,對(duì)于廣播變量,使用的是MEMORY_AND_DISK存儲(chǔ)級(jí)別抡四。如果想使用其他存儲(chǔ)級(jí)別柜蜈,可以調(diào)用persist(StroageLevel)。MEMORY_AND_DISK存儲(chǔ)級(jí)別時(shí)當(dāng)內(nèi)存足夠時(shí)直接保存到內(nèi)存隊(duì)列中床嫌,當(dāng)內(nèi)存不足時(shí)跨释,將釋放掉不屬于同一個(gè)RDD的block的內(nèi)存。