3 回答

TA貢獻(xiàn)1818條經(jīng)驗 獲得超11個贊
大多數(shù)RDD操作都是懶惰的。將RDD視為一系列操作的描述。RDD不是數(shù)據(jù)。所以這一行:
val textFile = sc.textFile("/user/emp.txt")
它什么都不做。它創(chuàng)建了一個RDD,上面寫著“我們需要加載這個文件”。此時未加載該文件。
需要觀察數(shù)據(jù)內(nèi)容的RDD操作不能是懶惰的。(這些被稱為動作。)一個例子是RDD.count
- 告訴你文件中的行數(shù),需要讀取文件。因此,如果您編寫textFile.count
,此時將讀取文件,將對行進(jìn)行計數(shù),并返回計數(shù)。
如果再打電話textFile.count
怎么辦?同樣的事情:文件將被讀取并再次計數(shù)。什么都沒有存儲。RDD不是數(shù)據(jù)。
那怎么RDD.cache
辦?如果您添加textFile.cache
到上面的代碼:
val textFile = sc.textFile("/user/emp.txt")textFile.cache
它什么都不做。RDD.cache
也是一個懶惰的操作。該文件仍未讀取。但是現(xiàn)在RDD說“讀取這個文件,然后緩存內(nèi)容”。如果您textFile.count
第一次運行,則將加載,緩存和計算該文件。如果textFile.count
再次呼叫,操作將使用緩存。它只會從緩存中獲取數(shù)據(jù)并計算行數(shù)。
緩存行為取決于可用內(nèi)存。例如,如果文件不適合內(nèi)存,textFile.count
則會回退到通常的行為并重新讀取文件。

TA貢獻(xiàn)1863條經(jīng)驗 獲得超2個贊
我們是否需要顯式調(diào)用“cache”或“persist”來將RDD數(shù)據(jù)存儲到內(nèi)存中?
是的,僅在需要時。
RDD數(shù)據(jù)默認(rèn)以分布式方式存儲在內(nèi)存中?
沒有!
這些是為什么:
Spark支持兩種類型的共享變量:廣播變量,可用于緩存所有節(jié)點的內(nèi)存中的值;累加器,它們是僅“添加”到的變量,例如計數(shù)器和總和。
RDD支持兩種類型的操作:轉(zhuǎn)換(從現(xiàn)有數(shù)據(jù)集創(chuàng)建新數(shù)據(jù)集)和操作(在數(shù)據(jù)集上運行計算后將值返回到驅(qū)動程序)。例如,map是一個轉(zhuǎn)換,它通過一個函數(shù)傳遞每個數(shù)據(jù)集元素,并返回一個表示結(jié)果的新RDD。另一方面,reduce是一個使用某個函數(shù)聚合RDD的所有元素的操作,并將最終結(jié)果返回給驅(qū)動程序(盡管還有一個返回分布式數(shù)據(jù)集的并行reduceByKey)。
Spark中的所有轉(zhuǎn)換都是惰性的,因為它們不會立即計算結(jié)果。相反,他們只記得應(yīng)用于某些基礎(chǔ)數(shù)據(jù)集的轉(zhuǎn)換(例如文件)。僅當(dāng)操作需要將結(jié)果返回到驅(qū)動程序時才會計算轉(zhuǎn)換。這種設(shè)計使Spark能夠更有效地運行 - 例如,我們可以意識到通過map創(chuàng)建的數(shù)據(jù)集將用于reduce,并僅將reduce的結(jié)果返回給驅(qū)動程序,而不是更大的映射數(shù)據(jù)集。
默認(rèn)情況下,每次對其執(zhí)行操作時,都可以重新計算每個轉(zhuǎn)換后的RDD。但是,您也可以使用持久化(或緩存)方法在內(nèi)存中保留RDD,在這種情況下,Spark會在群集上保留元素,以便在下次查詢時更快地訪問。還支持在磁盤上保留RDD或在多個節(jié)點上復(fù)制。
有關(guān)更多詳細(xì)信息,請查看Spark編程指南。
添加回答
舉報