Spark流错误:在发送给执行程序之前必须注册累加器

时间:2017-04-13 23:24:03

标签: apache-spark spark-streaming

我正在使用spark streaming做一些统计工作。这是我的代码:

val streamingContext = new StreamingContext(sparkSession.sparkContext, Seconds(60))
val eventHubsStream = EventHubsUtils.createUnionStream(streamingContext, eventHubsParameters)//create a stream

val accum =  sparkSession.sparkContext.longAccumulator("Total Count")

eventHubsStream.foreachRDD(rdd => {
    accum.add(rdd.count())
    SavetoStorage(accum); //save to storage
})

当我运行上述程序时,我收到了运行时错误:

  

“累积器必须在发送给执行者之前注册”

我已经在这里注册了累加器:

val accum =  sparkSession.sparkContext.longAccumulator("Total Count")

为什么会收到这样的错误?

由于

1 个答案:

答案 0 :(得分:2)

如果注册累加器,则可以修复。在Spark 2.2中,下一个代码运行良好

    val sc = spark.sparkContext
    sc.register(accum, <Name_of_your_accumulator>);
    ... next actions with accumulator ...

我希望它不会在下一个版本中被打破