Spark:当我在Range中使用它时,累加器无法正常工作

时间:2016-07-17 14:09:05

标签: scala apache-spark accumulator

我不明白为什么我的累加器没有被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]"),那么一切正常。

1 个答案:

答案 0 :(得分:2)

这里有两个不同的问题:

  • 您正在扩展App而非实施main方法。存在一些与此方法相关的已知问题,包括不正确的累加器行为以及由此it shouldn't be used in Spark applications。这很可能是问题的根源。

    有关扩展App的其他可能问题,请参阅SPARK-4170

  • 您在转换中使用累加器。这意味着累加器可以增加任意次数(给定作业成功时至少增加一次)。

    一般情况下,您需要确切的结果,您应该仅在foreachforeachPartition等操作中使用累加器,尽管您不太可能在这样的玩具应用程序中遇到任何问题。