火花累加器,我总得0值

时间:2018-05-10 09:31:59

标签: apache-spark

我正在使用LongAccumulator来计算我在Cassandra中保存的记录数。

object Main extends App {
  val conf = args(0)
  val ssc = StreamingContext.getStreamingContext(conf)
  Runner.apply(conf).startJob(ssc)

  StreamingContext.startStreamingContext(ssc)
  StreamingContext.stopStreamingContext(ssc)
}
class Runner (conf: Conf) {
    override def startJob(ssc: StreamingContext): Unit = {
        accTotal = ssc.sparkContext.longAccumulator("total")
        val inputKafka = createDirectStream(ssc, kafkaParams, topicsSet)
        val rddAvro = inputKafka.map{x => x.value()}
        saveToCassandra(rddAvro)
        println("XXX:" + accTotal.value) //-->0
    }


    def saveToCassandra(upserts: DStream[Data]) = {
        val rddCassandraUpsert = upserts.map {
            record =>
            accTotal.add(1)
            println("ACC: " + accTotal.value)  --> 1,2,3,4.. OK. Spark Web UI, ok too.
            DataExt(record.data,
                  record.data1)}
        rddCassandraUpsert.saveToCassandra(keyspace, table)
    }
}

我看到代码执行正确并且我在Cassandra中保存数据,当我最终打印累加器时值为0,但是如果我在地图功能中打印它我可以看到正确的值。为什么呢?

我正在使用Spark 2.0.2并在本地模式下从Intellj执行。我检查了火花网页UI,我可以看到累积更新。

1 个答案:

答案 0 :(得分:1)

问题可能在这里:

object Main extends App {
   ...

Spark doesn't support applications extending App这样做会导致非确定性行为:

  

请注意,应用程序应定义main()方法,而不是扩展scala.App。 scala.App的子类可能无法正常工作。

您应始终使用main的标准应用程序:

object Main {
    def main(args: Array[String]) {
      ...