あなたが1つのオペレータ機能に外部変数を使用する場合、デフォルトでは、この変数の値は、各タスクにコピーされます。このとき、各タスクは、唯一の変数シェアの独自のコピーを操作することができます。あなたは、変数を共有したい複数のタスクの場合、この方法では不可能です。
スパークは、一方が(可変ブロードキャスト)ブロードキャスト変数であり、この目的のために2つの共有変数を提供する他のアキュムレータ(累積変数)です。ブロードキャスト可変変数は、各ノードのコピーのみに使用され、使用することは、より大きなパフォーマンスを最適化し、ネットワークトラフィックを削減し、メモリ消費量です。あなたは、複数のタスクが主に蓄積するために使用される一般的な変数を操作することができアキュムレータ。
シェア放送変数(読み取り専用)
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("shared")
val sc = new SparkContext(conf)
val factor = 3
// 创建广播变量 factorBroadcast
val factorBroadcast = sc.broadcast(factor)
// Array(1,2,3,4,5)
val data = Array(1 to 5:_*)
val rdd = sc.parallelize(data,2)
// factorBroadcast.value 获取广播变量的值
rdd.map(num => num * factorBroadcast.value ).foreach(println)
sc.stop()
}
3
6
9
12
15
(書き込み専用)累積変数を共有します
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("shared")
val sc = new SparkContext(conf)
// 创建共享累加变量
var accumulator = sc.accumulator(0)
// Array(1,2,3,4,5)
val data = Array(1 to 5: _*)
val rdd = sc.parallelize(data, 2)
// accumulator.add(num) 累加rdd的数据
rdd.foreach(num => accumulator += num)
// 报错! 算子在Excutor端执行,不可读累加广播变量
// rdd.foreach(num => println(accumulator.value))
// 在driver端可以获取共享累加变量的值
println("共享累加变量的值为:" + accumulator.value)
sc.stop()
}
共享累加变量的值为:15