2016-02-29 59 views
0

我的假設是在驅動程序中的Spark上下文中保留了一個累加器。與廣播變量不同,累加器的值不會發送到羣集中的工作節點。它是否正確 ?如果是這樣,Spark Context中的更新機制是什麼?在工作節點上執行的各種執行程序如何更新它?它是一個Singleton對象嗎?Spark中的累加器變量在哪裏存在?

回答

1

從集羣上運行的spark documentation

任務引用然後可以使用添加方法或+ =運算符(Scala中和Python)添加到其中。但是,它們無法讀取其價值。只有驅動程序可以使用其值方法讀取累加器的值。

看看實現,似乎累加器保持它的值在驅動器端(它可以被讀取)。

至於執行者。我發現在反序列化時累加器被註冊到TaskContext。所以看起來,執行者保留自己的內部累加器,後者與司機的實際累加器合併。

累加器不是單體對象,因爲可以創建多個累加器。然而,執行者有一種手段來與驅動程序應用程序的原始累加器進行通信。

+0

但是,如果執行者保留自己的內部累加器,執行者如何進行更新?所以執行者1稱加2,執行者2加1等,這些都是由驅動程序在其「黃金」累加器中加起來的嗎? – femibyte

+0

是的。根據我在代碼中看到的,累加器具有合併功能,用於合併執行程序的結果以計算驅動程序中的最終結果。 – Wellingr