Spark惰性求值與持久化(快取)

2021-09-21 18:18:08 字數 2498 閱讀 2149

惰性求值意味著當我們對rdd呼叫轉化操作(例如呼叫map()時),操作不會立即執行。相反,spark會在內部記錄下所要求執行的操作的相關資訊。我們不應該把rdd看作存放著特定資料的資料集,而最好把每個rdd當作我們通過轉化操作構建出來的、記錄如何計算資料的指令列表。把資料讀取到rdd的操作也同樣是惰性的。因此,當我們呼叫sc.textfile()時,資料並沒有讀取進來,而是在必要時才會讀取。和轉化操作一樣的是,讀取資料的操作也有可能會多次執行。

spark使用惰性求值,這樣就可以把一些操作合併到一起來減少計算資料的步驟。

scala> val lines = sc.

textfile

("readme.md"

)lines: spark.rdd[string]..

.]scala> val pythonlines = lines.

filter

(line =

> line.

contains

("python"))

pythonlines: spark.rdd[string]

= filteredrdd[..

.]scala> pythonlines.

first()

res0: string = ## interactive python shell

比如在上述語句中,我們以乙個文字檔案定義了資料,然後把其中包含python的行篩選出來。如果spark在我們執行lines = s.textfile()時就把檔案中所有的行都讀取並儲存起來,就會消耗很多儲存空間,而我們馬上就要篩選掉其中的很多資料。相反,一旦spark了解了完整的轉化操作鏈之後,它就可以只計算求結果時真正需要的資料。事實上,在行動操作first()中,spark只需要掃瞄檔案直到找到第乙個匹配的行為為止,而不需要讀取整個檔案。

在類似hadoop mapreduce的系統中,開發者常常花費大量時間考慮如何把操作組合到一起,以減少mapreduce的週期數。而在spark中,寫出乙個非常複雜的對映並不見得能比使用很多簡單的連續操作獲得好很多的效能。

如前所述,spark rdd 是惰性求值的,而有時我們希望能多次使用同乙個rdd。如果簡單地對rdd 呼叫行動操作,spark 每次都會重算rdd以及它的所有依賴。這在迭代演算法中消耗格外大,因為迭代演算法常常會多次使用同一組資料。下面就是先對rdd 作一次計數、再把該rdd 輸出的乙個小例子。

val input = sc.

parallelize

(list(1

,3,5

,7))

val result = input.

map(x =

> x*x)

println

(result.

count()

)println

(result.

collect()

.mkstring

(","

))

為了避免多次計算同乙個rdd,可以讓spark 對資料進行持久化。當我們讓spark 持久化儲存乙個rdd 時,計算出rdd 的節點會分別儲存它們所求出的分割槽資料。如果乙個有持久化資料的節點發生故障,spark 會在需要用到快取的資料時重算丟失的資料分割槽。如果希望節點故障的情況不會拖累我們的執行速度,也可以把資料備份到多個節點上。出於不同的目的,我們可以為rdd 選擇不同的持久化級別。

))注意,我們在第一次對這個rdd 呼叫行動操作前就呼叫了persist() 方法。persist() 調

用本身不會觸發強制求值。

如果要快取的資料太多,記憶體中放不下,spark 會自動利用最近最少使用(lru)的快取策略把最老的分割槽從記憶體中移除。對於僅把資料存放在記憶體中的快取級別,下一次要用到已經被移除的分割槽時,這些分割槽就需要重新計算。但是對於使用記憶體與磁碟的快取級別的分割槽來說,被移除的分割槽都會寫入磁碟。不論哪一種情況,都不必擔心你的作業因為快取了太多資料而被打斷。不過,快取不必要的資料會導致有用的資料被移出記憶體,帶來更多重算的時間開銷。

最後,rdd 還有乙個方法叫作unpersist(),呼叫該方法可以手動把持久化的rdd 從緩

存中移除。

參考 《spark快速大資料分析》

spark持久化(快取)

1 惰性求值 rdd轉化過程都是惰性求值的。這意味著在被呼叫行動操作之前spark不會開始計算,spark會在內部記錄下所要求執行的操作的相關資訊,我們可以把每個rdd看作我們通過轉化操作構建出來的 記錄如何計算資料的指定列表。把資料讀取到rdd的操作同樣是惰性的。2 持久化快取 sparkrdd是...

柯里化與惰性求值

柯里化是函式式程式設計裡的概念。理論上說,柯里化是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數而且返回結果的新函式的技術。例如有函式 sub f1 這裡f1接受2個引數。所以如果我們固定 b 1,就得到sub f1 1 這是乙個接受1個引數的新函式...

spark的持久化

預設將rdd的資料持久化到記憶體中。cache是懶執行。注意 cache persist persist storagelevel.memory only 可以指定持久化的級別。最常用的是memory only和memory and disk。2 表示有副本數。cache和persist注意事項 c...