Spark 緩存機制 + 共享變量


一、Spark中的緩存機制:

  避免spark每次都重算RDD以及它的所有依賴,cache()、persist()、 checkpoint()。

1、cache():會被重復使用,但是不能太大的RDD,將其cache()到內存當中,catch()屬於 memory only 。cache 是每計算出一個要 cache 的 partition 就直接將其 cache 到內存中。緩存完之后,可以在任務監控界面storage里面看到緩存的數據。

spark cache (幾種緩存方法):https://blog.csdn.net/zhuiqiuuuu/article/details/79290221

 

2、persist():可以設置緩存級別,如只在內存,只在磁盤,內存磁盤都用。

MEMORY_ONLY

MEMORY_AND_DISK

MEMORY_ONLY_SER

MEMORY_AND_DISK_SER

DISK_ONLY

MEMORY_ONLY_2, MEMORY_AND_DISK_2, 等等

持久化級別詳解:http://bcxw.net/article/425.html

 

3、checkpoint():computing chain 計算鏈過長或依賴其他 RDD 很多的 RDD,就需要進行checkpoint,將其放入到磁盤當中。

  checkpoint 需要等到job完成了,在啟動專門的job去完成checkpoint 操作,因此RDD是被計算了兩次的。一般使用的時候配合rdd.cache(),這樣第二次就不用重新計算RDD了,直接讀取 cache 寫磁盤。

  rdd.persist(StorageLevel.DISK_ONLY) 與 checkpoint 也有區別,persist一旦程序執行結束,所有的緩存無論在內存還是磁盤都會被刪掉。而而 checkpoint 將 RDD 持久化到 HDFS 或本地文件夾,如果不被手動 remove 掉,是一直存在的,也就是說可以被下一個 driver,program 使用,而 cached RDD 不能被其他 dirver program 使用。

        同時:cache 跟 persist不會截斷血緣關系,checkPoint會截斷血緣關系。

 

補充:緩存太多的時候,spark會自動使用 LRU 緩存策略(最近最少使用緩存策略),將最老的分區從內存中移除。若下次使用被移除的分區時,只能重算。

 

二、spark中的共享變量:

spark中的共享變量有  累加器、廣播變量

  共享變量出現的原因:通常在向spark中傳遞函數時,例如使用map或者filter傳遞條件時,可以使用驅動器程序中定義的變量,但是集群中運行的每個任務都會得到這些變量的一個新的副本,更新這些副本不會改變驅動器中的變量。spark累加器、廣播變量就分別為結果聚合和廣播突破了這一限制。

1、累加器:將工作節點的變量值聚合到驅動器程序中。

創建和取值方法見上。

常見應用:在調試時對作業執行過程中的事件進行計數。例如統計文件中的空行。

2、廣播變量:讓驅動程序高效的向所有工作節點發送一個只讀值。例如發送一個只讀的查詢表。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM