我正在使用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,我可以看到累积更新。
答案 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]) {
...