Spark 累加器注意点

注意点:存在多个action算子的时候,accumulator可能存在重复计算的情况

验证:

第一步先获取一个accumulator

//accumulator
LongAccumulator accum = sc.sc().longAccumulator();

此时进行累加求和操作:

JavaRDD<Integer> map = sc.parallelize(Arrays.asList(1, 2, 3, 4)).map(x -> {
			accum.add(1);
			return x;
});
map.count();
System.out.println("value:"+accum.value());

输出:

value:4

此时,再添加一个算子:

JavaRDD<Integer> map = sc.parallelize(Arrays.asList(1, 2, 3, 4)).map(x -> {
			accum.add(1);
			return x;
});
map.count();
System.out.println("value:"+accum.value());
map.foreach(x -> System.out.println(x));
System.out.println("value2:"+accum.value());

此刻输出为:

value:4
value2:8

原因解释:虽然在后续的操作中未使用accum进行累加操作,但是值还是增加了,原因是因为accumulator与spark的懒加载机制一样,action会触发之前的transformation操作,所以当后面调用foreach算子时,accum又重新计算了一次,导致最后的值为8.

解决方法:

在action操作之后加入:

map.cache();

将job之间的依赖进行分隔。


欢迎加群大家一起学习大数据~群里还有很多资料可供参考~

大数据大佬菜鸡交流群 575419003

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值