3 回答

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

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