【问题标题】:Spark: Accumulators does not work properly when I use it in RangeSpark:当我在 Range 中使用累加器时,它无法正常工作
【发布时间】:2016-07-17 23:56:14
【问题描述】:

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

【问题讨论】:

  • 什么是acc0?你在工作acc,是不是打错字了?
  • 对不起,我的意思是acc

标签: scala apache-spark accumulator


【解决方案1】:

这里有两个不同的问题:

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

    请参阅 SPARK-4170 以了解与扩展 App 相关的其他可能问题。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-03
    • 2022-11-15
    • 2018-09-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多