我有一个Spark Streaming应用程序,可以读取Kafka流并将数据插入数据库。
这是代码段
eventDStream.foreachRDD { (rdd, time) =>
val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
// First example that works
val accumulator = streamingContext.sparkContext.longAccumulator
rdd.foreachPartition { records =>
val count = Consumer.process(records)
accumulator.add(count)
}
println(s"accumulated $accumulator.value")
// do the same but aggregate count, does not work
val results = rdd.mapPartitions(records => Consumer.processIterator(records))
val x = results.fold(0)(_ + _)
println(x)
eventDStream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
}
在第一部分中,我将foreachPartition
与一个累加器一起使用来计算成功插入的次数
在第二部分中,我计算了一个RDD[Int]
,它表示每个RDD
中成功插入的次数,并使用fold
函数汇总结果
但是第二部分总是打印0,而第一部分总是按照我想要的做。
你能告诉我为什么吗?
谢谢