累加器用来把Executor 端变量信息聚合到Driver 端。在Driver 程序中定义的变量,在Executor 端的每个Task 都会得到这个变量的一份新的副本,每个 task 更新这些副本的值后, 传回Driver 端进行 merge。
object Test{
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")
val sc: SparkContext = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(1,2,3,4))
//val i = rdd.reduce(_+_)
//println(i)//10
//获取系统累加器
//spark 默认提供了简单数据聚合的累加器
//longAccumulator,doubleAccumulator,collectionAccumulator
val sumAcc = sc.longAccumulator("sum")
rdd.foreach(
num =>
sumAcc.add(num)
)
println(sumAcc.value)//10
//累加器一般放在执行算子中使用;
//放在转换算子中可能可能出现异常,出现少加或多加的情况
//少加:没有行动算子,不算执行;
//多加:多次执行行动算子,多次累加
}
}
配合代码图片解释



