AssertionError:断言失败:copyAndReset必须返回零值副本

时间:2017-02-20 03:59:37

标签: apache-spark apache-beam

当我将ParDo.of(new ParDoFn())应用于名为PCollection的{​​{1}}时,该程序会抛出此异常。但是当我删除textInput时,该程序是正常的。

// SparkRunner

.apply(ParDo.of(new ParDoFn()))

2 个答案:

答案 0 :(得分:3)

你在哪个Spark版本上运行?根据我的经验,Spark 2.x AccumulatorV2抛出了你得到的错误,Spark转发器目前支持Spark 1.6。

答案 1 :(得分:1)

当我创建扩展org.apache.spark.util.AccumulatorV2的自定义累加器时,我遇到了类似的问题。原因是override def isZero: Boolean方法中的逻辑不正确。因此,基本上默认情况下调用copyAndReset方法会调用copy(),然后reset() isZero()应该返回true。 如果您查看AccumulatorV2源,那么检查是:

// Called by Java when serializing an object
final protected def writeReplace(): Any = {
 if (atDriverSide) {
   if (!isRegistered) {
     throw new UnsupportedOperationException(
       "Accumulator must be registered before send to executor")
   }
   val copyAcc = copyAndReset()
   assert(copyAcc.isZero, "copyAndReset must return a zero value copy")
   copyAcc.metadata = metadata
   copyAcc
 } else {
   this
 }
}

特别是这部分

 val copyAcc = copyAndReset()
 assert(copyAcc.isZero, "copyAndReset must return a zero value copy")

希望它有所帮助。快乐的火花!