1. 程式人生 > >Learning Spark筆記5-持久化(快取)

Learning Spark筆記5-持久化(快取)

持久化(快取)


之前討論過,Spark RDDs是lazily evaluated,我們可能會多次使用同一個RDD。如果這樣做的話,每次在RDD上呼叫一個動作時,Spark都將重新計算RDD以及它的所有依賴。對於迭代演算法就特別的耗費資源,下面是一個計數的例子。


Example 3-39. Double execution in Scala


val result = input.map(x => x*x)
println(result.count())
println(result.collect().mkString(","))


防止多次一個RDD,我們可以讓Spark持久化資料。當我們讓Spark持久化一個RDD的時候,計算RDD的節點會儲存他們的分割槽。如果在一個節點上持久化時失敗了,那麼Spark會根據需要重新計算丟失資料的分割槽。如果我們不想要讓叢集變慢,那麼我們就可以在複製多個數據到不同的節點上。


Spark可以根據不同的目的,支援不同級別的持久化。在Scala和Java中,預設的persist()會將資料以非序列化物件形式儲存在JVM堆中。對於Python,通常是序列化資料到持久化的儲存。


堆疊快取還是實驗性的,這裡使用了Tachyon。


Example 3-40. persist() in Scala
val result = input.map(x => x * x)
result.persist(StorageLevel.DISK_ONLY)
println(result.count())
println(result.collect().mkString(","))


注意我們在第一個動作之前呼叫persist()。


如果在記憶體中儲存了太多的資料,Spark將使用最近最少(LRU)快取策略自動釋放舊分割槽。對於僅記憶體儲存級別,下次它被訪問時會重新計算所有分割槽,但對於記憶體-磁碟的方式,它會將他們寫到磁碟上。


RDDs有一個unpersist(),可以手動刪除快取