spark乙個非常重要的特性就是共享變數。預設情況下,如果在乙個運算元的函式中使用到了某個外部的變數,那麼這個變數的值會被拷貝到每個task中。此時每個task只能操作自己的那份變數副本。如果多個task想要共享某個變數,那麼這種方式是做不到的。
spark為此提供了兩種共享變數,一種是broadcast variable(廣播變數),另一種是accumulator(累加變數)。broadcast variable會將使用到的變數,僅僅為每個節點拷貝乙份,更大的用處是優化效能,減少網路傳輸以及記憶體消耗。accumulator則可以讓多個task共同操作乙份變數,主要可以進行累加操作。
spark提供的broadcast variable,是唯讀的。並且在每個節點上只會有乙份副本,而不會為每個task都拷貝乙份副本。因此其最大作用,就是減少變數到各個節點的網路傳輸消耗,以及在各個節點上的記憶體消耗。此外,spark自己內部也使用了高效的廣播演算法來減少網路消耗。
可以通過呼叫sparkcontext的broadcast()方法,來針對某個變數建立廣播變數。然後在運算元的函式內,使用到廣播變數時,每個節點只會拷貝乙份副本了。每個節點可以使用廣播變數的value()方法獲取值。記住,廣播變數,是唯讀的。
例如:val factor = 3
val factorbroadcast = sc.broadcast(factor)
val arr = array(1, 2, 3, 4, 5)
val rdd = sc.parallelize(arr)
val multiplerdd = rdd.map(num => num * factorbroadcast.value())
multiplerdd.foreach(num => println(num))
spark提供的accumulator,主要用於多個節點對乙個變數進行共享性的操作。accumulator只提供了累加的功能。但是確給我們提供了多個task對乙個變數並行操作的功能。但是task只能對accumulator進行累加操作,不能讀取它的值。只有driver程式可以讀取accumulator的值。
例如:val sumaccumulator = sc.accumulator(0)
val arr = array(1, 2, 3, 4, 5)
val rdd = sc.parallelize(arr)
rdd.foreach(num => sumaccumulator += num)
println(sumaccumulator.value)
Spark共享變數
預設情況下,如果在乙個運算元的函式中使用到了某個外部的變數,那麼這個變數的值會被拷貝到每個task中。此時每個task只能操作自己的那份變數副本。如果多個task想要共享某個變數,那麼這種方式是做不到的。spark為此提供了兩種共享變數,一種是broadcast variable 廣播變數 另一種是...
Spark高階篇 共享變數
目錄 共享變數 廣播變數 概述 原理 實現 總結累加器 概述 實現 總結 使用廣播變數,每個executor的記憶體中,只駐留乙份變數副本,而不是對每個task都傳輸一次變數,省去了很多的網路傳輸,對效能的提公升有很大的幫助,而且通過高效的廣播演算法來減少傳輸代價。使用廣播變數的場景很多,spark...
Spark基礎 4 共享變數
廣播變數 broadcast variables 允許程式開發人員在每個機器上面快取乙個唯讀的變數,而不是為機器上的每個任務都生成乙個副本。spark的 行動 操作會跨越多個階段 stage 對於每個階段內的所有任務所需要的公共資料,spark都會自動進行廣播。可以通過sparkcontext.br...