如何在Spark中定义全局scala变量,将由所有工作人员共享?

时间:2015-04-01 06:07:28

标签: scala global-variables apache-spark

在Spark程序中,我想要定义一个变量,如不可变映射,所有工人程序将同步访问,我该怎么办?我应该定义一个scala对象吗?

不仅是不可变映射,如果我想要一个可以共享的变量并且可以同步更新怎么办?例如,'mutable map','var Int'或'var String'或其他一些?我该怎么办? scala对象变量是否正常?例如:

Object SparkObj{
var x:Int
var y:String
}
  1. x和y由驱动程序而不是工作程序维护并由所有人共享 工作人员?
  2. x和y只有一个副本而不是几个副本吗?

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

1 个答案:

答案 0 :(得分:3)

如果引用在worker上运行的闭包内的变量,它将被捕获,序列化并发送给worker。例如:

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

然而,工人们没有发回任何东西。如果您向工作人员中的mutable.Seq添加内容,则无法从任何位置看到更改。您将修改在执行闭包后丢弃的对象。

Apache Spark提供了许多用于执行分布式计算的基元。同步可变状态不是其中之一。