在Spark程序中,我想定义一个类似变量的不可变映射,它将被所有工作程序同步访问,我能做什么?我应该定义一个scala对象吗?
不仅仅是不可变的映射,如果我想要一个可以共享并且可以同步更新的变量呢?例如,一个"可变映射"、一个"var Int"或"var String"或其他一些?我能做什么?scala对象变量可以吗?例如:
Object SparkObj{
var x:Int
var y:String
}
- x和y是否由驾驶员而非工人维护,并由所有人共享工人
x和y只有一个副本而不是几个副本吗?
对x和y的更新是同步的吗?
如果引用在worker上运行的闭包中的变量,它将被捕获、序列化并发送给worker。例如:
val i = 5
rdd.map(_ + i) // "i" is sent to the workers, they add 5 to each element.
然而,工人们什么也没寄回来。如果您在工作线程内的mutable.Seq
中添加了一些内容,则从任何位置都看不到更改。您将修改一个在执行闭包后被丢弃的对象。
Apache Spark提供了许多用于执行分布式计算的基元。同步可变状态不是其中之一。