当我将ParDo.of(new ParDoFn())
应用于名为PCollection
的{{1}}时,该程序会抛出此异常。但是当我删除textInput
时,该程序是正常的。
// SparkRunner
.apply(ParDo.of(new ParDoFn()))
答案 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")
希望它有所帮助。快乐的火花!