一、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、廣播變量:讓驅動程序高效的向所有工作節點發送一個只讀值。例如發送一個只讀的查詢表。


