应用场景
累加器的定义和应用场景很好理解,分布式场景下,我们希望对一个数进行全局性的累加,但由于我们的定义的普通全局变量,到各个分区只是一个副本,且不会影响driver处本身的全局变量值,在执行rdd计算的时候只是在各分区实现了自己的累加,并不能最终体现到driver定义的变量本身,因此spark引入了累加器,spark的累加器也是在各自的分区中累加,但在执行collect操作的时候会对各分区累加之和再做一次累加
if __name__ == '__main__':
conf = SparkConf().setAppName("test").setMaster("local[*]")
sc = SparkContext(conf=conf)
rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10],2)
#Spark提供的累加器变量,参数是初始值
acmlt = sc.accumulator(0)
def map_func(data):
global acmlt
acmlt +1
print(acmlt)
print(acmlt)
注意事项
在使用累加器时,需要注意的是,如果我们的rdd被释放掉了又重新构建(没有缓存会重新构建),这时累加器会多次工作,可能会导致非预期结果。