分布式共享只写变量
实现原理:
累加器用来把Executor端变量信息聚合到Driver端,在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行merge
// Spark默认就提供了简单数据聚合的累加器
val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("spark")
val sc = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(1,2,3,4))
val sumAcc: LongAccumulator = sc.longAccumulator("sum")
rdd.foreach(
num => {
sumAcc.add(num)
}
)
val value: lang.Long = sumAcc.value
print(value)
还有double,collection类型累加器
少加的情况:
转换算子中调用累加器,如果没有行动算子的话,那么不会执行
多加的情况:
转换算子中调用累加器,行动算子多次执行导致多加
一般情况下,累加器会放置在行动算子中