我不明白为什么我的累加器没有被Spark正确更新。
object AccumulatorsExample extends App {
val acc = sc.accumulator(0L, "acc")
sc range(0, 20000, step = 25) map { _ => acc += 1 } count()
assert(acc.value == 800) // not equals
}
我的Spark配置:
setMaster("local[*]") // should use 8 cpu cores
我不确定Spark是否在每个核心上分配累加器的计算,这可能就是问题所在。
我的问题是如何在一个总和中汇总所有acc
值并获得正确的累加器值(800)?
PS 的
如果我限制核心编号setMaster("local[1]")
,那么一切正常。
答案 0 :(得分:2)
这里有两个不同的问题:
您正在扩展App
而非实施main
方法。存在一些与此方法相关的已知问题,包括不正确的累加器行为以及由此it shouldn't be used in Spark applications。这很可能是问题的根源。
有关扩展App
的其他可能问题,请参阅SPARK-4170。
您在转换中使用累加器。这意味着累加器可以增加任意次数(给定作业成功时至少增加一次)。
一般情况下,您需要确切的结果,您应该仅在foreach
和foreachPartition
等操作中使用累加器,尽管您不太可能在这样的玩具应用程序中遇到任何问题。