亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

(為什么)我們需要在RDD上調用緩存或持久化

(為什么)我們需要在RDD上調用緩存或持久化

(為什么)我們需要在RDD上調用緩存或持久化當從文本文件或集合(或從另一個RDD)創建彈性分布式數據集(RDD)時,我們是否需要顯式調用“cache”或“persist”來將RDD數據存儲到內存中?或者默認情況下RDD數據是以分布式方式存儲在內存中的嗎?val textFile = sc.textFile("/user/emp.txt")根據我的理解,在上面的步驟之后,textFile是一個RDD,并且可以在節點的所有/部分內存中使用。如果是這樣,為什么我們需要在textFile RDD上調用“cache”或“persist”呢?
查看完整描述

3 回答

?
慕尼黑8549860

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則會回退到通常的行為并重新讀取文件。


查看完整回答
反對 回復 2019-08-15
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

我們是否需要顯式調用“cache”或“persist”來將RDD數據存儲到內存中?

是的,僅在需要時。

RDD數據默認以分布式方式存儲在內存中?

沒有!

這些是為什么:

  • Spark支持兩種類型的共享變量:廣播變量,可用于緩存所有節點的內存中的值;累加器,它們是僅“添加”到的變量,例如計數器和總和。

  • RDD支持兩種類型的操作:轉換(從現有數據集創建新數據集)和操作(在數據集上運行計算后將值返回到驅動程序)。例如,map是一個轉換,它通過一個函數傳遞每個數據集元素,并返回一個表示結果的新RDD。另一方面,reduce是一個使用某個函數聚合RDD的所有元素的操作,并將最終結果返回給驅動程序(盡管還有一個返回分布式數據集的并行reduceByKey)。

  • Spark中的所有轉換都是惰性的,因為它們不會立即計算結果。相反,他們只記得應用于某些基礎數據集的轉換(例如文件)。僅當操作需要將結果返回到驅動程序時才會計算轉換。這種設計使Spark能夠更有效地運行 - 例如,我們可以意識到通過map創建的數據集將用于reduce,并僅將reduce的結果返回給驅動程序,而不是更大的映射數據集。

  • 默認情況下,每次對其執行操作時,都可以重新計算每個轉換后的RDD。但是,您也可以使用持久化(或緩存)方法在內存中保留RDD,在這種情況下,Spark會在群集上保留元素,以便在下次查詢時更快地訪問。還支持在磁盤上保留RDD或在多個節點上復制。

有關更多詳細信息,請查看Spark編程指南。


查看完整回答
反對 回復 2019-08-15
  • 3 回答
  • 0 關注
  • 827 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號