累加器和廣播變數 共享變數

2021-10-24 05:31:09 字數 1077 閱讀 5579

兩大類:

1、boradcast variables  廣播變數

廣播變數的產生原因:

如果乙個變數需要在每個task中都使用一次,那麼預設情況下,就是每乙個task都會拷貝乙份副本。如果這個變數比較小,那麼無所謂。如果這個變數有100m,乙個executor中併發執行了30個執行緒,那麼最終會占用記憶體3g了。

使用了廣播變數之後,這個變數就被廣播給了每個exector,那麼該exector中的所有的task都共享這個變數,也就是相當於不管這個executor中啟動了多少個執行緒,最終這個記憶體的使用量就是100m。

作用:節省網路帶框和節點的使用記憶體

2、accumulators  累加器

與mapreduce中的全域性計數器的原理和作用一摸一樣。

作用:完成某些特殊的業務

案例:累加器的作用:可以實現乙個變數在不同的executor端能保持狀態的累加。

def main(args: array[string]): unit = )

res.cache().count()

println(acc.value)

res.collect()

print(acc.value)

}

上述map運算元中的計算過程是在executor端進行的,但是ac是在driver端定義的,所以driver端的ac是接收不到executor端計算過的ac的值。

使用累加器注意的事項:防止重複累加

累加器是在遇到action運算元的時候才進行累加操作的,使用累加器的過程中只能使用一次action的操作才能保證結果的準確性。

解決防止重複累加的問題:使用cache,persist運算元,之後可以多次使用action運算元。

val myacc = sc.longaccumulator("myacc")

myacc.add(x)

println(myacc.value)

題目:如何使用spark編寫mapjoin程式?

把小表的所有資料處理成乙個map,然後通過廣播變數傳給所有執行這個task的executor程序,每個執行緒在執行乙個task的時候,就都只需要從exector中獲取即可。

關於廣播變數和累加器

廣播變數 groadcast varible 為唯讀變數,使用廣播變數的好處 每個節點的executor有乙個副本,不是每個task有乙個副本,可以優化資源提高效能,比如機器學習的時候。累加器 累加器可以在各個executor之間共享,修改,其中有幾種建立方法 objectaccumulatorte...

10 累加器和廣播變數

在建立函式時,如果需要捕獲自由變數,那麼包含指向 獲變數的引用的函式就被稱為閉包函式。在實際計算時,spark 會將對 rdd 操作分解為 task,task 執行在 worker node 上。在執行之前,spark 會對任務進行閉包,如果閉包內涉及到自由變數,則程式會進行拷貝,並將副本變數放在閉...

spark RDD累加器和廣播變數

在預設情況下,當spark在集群的多個不同節點的多個任務上並行執行乙個函式時,它會把函式中涉及到的每個變數,在每個任務 上都生成乙個副本。但是,有時候需要在多個任務之間共享變數,或者在任務 task 和任務控制節點 driver program 之間共享變數。為了滿足這種需求,spark提供了兩種型...