spark RDD累加器和廣播變數

2021-10-05 00:27:30 字數 1248 閱讀 9506

在預設情況下,當spark在集群的多個不同節點的多個任務上並行執行乙個函式時,它會把函式中涉及到的每個變數,在每個任務

上都生成乙個副本。但是,有時候需要在多個任務之間共享變數,或者在任務(task)和任務控制節點(driver program)之間共享變數。

為了滿足這種需求,spark提供了兩種型別的變數:

累加器accumulators:累加器支援在所有不同節點之間進行累加計算(比如計數或者求和)

廣播變數broadcast variables:廣播變數用來把變數在所有節點的記憶體之間進行共享,在每個機器上快取乙個唯讀的變數,而不是為機器上的每個任務都生成乙個副本。

不使用累加器

使用累加器

通常在向 spark 傳遞函式時,比如使用 map() 函式或者用 filter() 傳條件時,可以使用驅動器程式中定義的變數,但是集群中執行的每個任務都會得到這些變數的乙份新的副本,更新這些副本的值也不會影響驅動器中的對應變數。這時使用累加器就可以實現我們想要的效果。

val xx: accumulator[int] = sc.accumulator(0)

**演示

importorg.apache.spark.rdd.rdd

importorg.apache.spark.

objectaccumulatortest

}

不使用廣播變數

使用廣播變數

**演示

importorg.apache.spark.broadcast.broadcast

importorg.apache.spark.rdd.rdd

importorg.apache.spark.

objectbroadcastvariablestest

}

關於廣播變數和累加器

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

10 累加器和廣播變數

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

Spark累加器和廣播變數

累加器有些類似redis的計數器,但要比計數器強大,不僅可以用於計數,還可以用來累加求和 累加合併元素等。假設我們有乙個word.txt文字,我們想要統計該文字中單詞 sheep 的行數,我們可以直接讀取文字filter過濾然後計數。sc.textfile word.txt filter conta...