2015-04-01 53 views
1

在Spark程序中,我想要定義一個像所有工人程序將同步訪問的不可變映射的變量,我該怎麼辦?我應該定義一個scala對象嗎?如何在Spark中定義一個全局的scala變量,並由所有的工作人員共享?

不僅是不可變的映射,如果我想要一個可以共享並可以同步更新的變量,該怎麼辦?例如,「可變映射」,「var Int」或「var String」或其他一些?我該怎麼辦?是Scala的對象變量OK?例如:

Object SparkObj{ 
var x:Int 
var y:String 
} 
  1. 爲x和y的驅動程序,而工人維護和共享所有 工人呢?
  2. x和y只有一個副本而不是幾個副本?

  3. x和y的更新是否同步?

+0

不是很酷來編輯一個問題,與原來被問到的相反情況 - 刪除我的答案。 – maasg 2015-04-02 06:24:17

回答

3

如果您引用在工人上運行的閉包中的變量,它將被捕獲,序列化併發送給工作人員。例如:

val i = 5 
rdd.map(_ + i) // "i" is sent to the workers, they add 5 to each element. 

但是,工作人員沒有發回任何東西。如果您在工作人員內部添加了mutable.Seq,則該更改將無法在任何地方顯示。您將修改執行閉包後丟棄的對象。

Apache Spark提供了許多用於執行分佈式計算的基元。同步的可變狀態不是其中之一。

相關問題