在Spark中,當任何函式傳遞給轉換操作時,它將在遠端叢集節點上執行。它適用於函式中使用的所有變數的不同副本。這些變數將複製到每台計算機,並且遠端計算機上的變數更新不會恢復到驅動程式。
廣播變數支援在每台機器上快取的唯讀變數,而不是提供任務的副本。Spark使用廣播演算法來分發廣播變數以降低通訊成本。
spark動作的執行經過幾個階段,由分散式「shuffle」操作分開。Spark自動廣播每個階段中任務所需的公共資料。以這種方式廣播的資料以序列化形式快取並在執行每個任務之前反序列化。
要建立廣播變數(比方說,v
),請呼叫SparkContext.broadcast(v)
。讓我們通過一個例子來理解。
scala> val a=sc.longAccumulator("Accumulator")
scala> sc.parallelize(Array(2,5)).foreach(x=>a.add(x))
scala> a.value
累加器是用於執行關聯和交換操作(例如計數器或總和)的變數。Spark為數位型別的累加器提供支援。但是,可以新增對新型別的支援。
要建立數位累加器,請呼叫SparkContext.longAccumulator()
或SparkContext.doubleAccumulator()
以累積Long
或Double
型別的值。
範例
scala> val a=sc.longAccumulator("Accumulator")
scala> sc.parallelize(Array(2,5)).foreach(x=>a.add(x))
scala> a.value