如果想在節點之間共享一份變量,spark提供了兩種特定的共享變量,來完成節點之間的變量共享。
(1)廣播變量(2)累加器
二、廣播變量
概念:
廣播變量允許程序員緩存一個只讀的變量在每台機器上,而不是每個任務保存一個拷貝。例如,利用廣播變量,我們能夠以一種更有效率的方式將一個大數據量輸入集合的副本分配給每個節點。
一個廣播變量可以通過調用SparkContext.broadcast(v)方法從一個初始變量v中創建。廣播變量是v的一個包裝變量,它的值可以通過value方法訪問。
用途:比如一個配置文件,可以共享給所有節點。比如一個Node的計算結果需要共享給其他節點。
聲明:broadcast
調用broadcast,Scala中一切可序列化的對象都可以進行廣播。
sc.broadcast(xxx)
引用廣播變量數據:value
可在各個計算節點中通過 bc.value來引用廣播的數據。
更新廣播變量:unpersist
由於廣播變量是只讀的,即廣播出去的變量沒法再修改,
利用unpersist函數將老的廣播變量刪除,然后重新廣播一遍新的廣播變量。
bc.unpersist()
銷毀廣播變量:destroy
bc.destroy()可將廣播變量的數據和元數據一同銷毀,銷毀之后就不能再使用了。
三、累加器
概念:
累加器是一種只能利用關聯操作做“加”操作的變數,因此他能夠快速執行並行操作。而且其能夠操作counters和sums。Spark原本支援數值類型的累加器,程序員可以自行增加可被支援的類型。如果建立一個具體的累加器,其可在spark UI上顯示。
用途:
對信息進行聚合,累加器的一個常見的用途是在調試時對作業的執行過程中事件進行計數。
創建累加器:accumulator
調用SparkContext.accumulator(v)方法從一個初始變量v中創建。
運行在集群上的任務可以通過add方法或者使用+=操作來給它加值。然而,它們無法讀取這個值。和廣播變量相反,累加器是一種add only的變項。
累加器的陷阱
打破累加器陷阱:persist函數
存累加器初始值:
累加器實現一些基本的功能: