Spark中涉及到共享变量的话,有两种办法:
一.
broadcast variables 只读变量,创建后将向所有的executor节点进行分发。各个executor计算是,可以取出这个变量,来参与计算。相比直接将需要的文件拷贝到各个节点,更加高效。spark在计算的每个stage将会自动广播公共数据到计算节点。
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)
二.
accumulators 类似于MapReduce中Counter,可以用来做全局记数。accumulators保证在每个action操作中,不会由于task任务失败重新计算而导致值不准确。但是在transfomation中,并不提供这个保证。
scala> val accum = sc.accumulator(0, "My Accumulator")
accum: spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s
scala> accum.value
res2: Int = 10
当然,spark也支持自己定义accumulators.