我有以下代码加入来自Kafka的两个流:
val joinViewClickDstream = newViewDstream.fullOuterJoin(newClickDstream).map { elem =>
(elem._1, (elem._2._1.getOrElse(Event(0,0L,0,0L,0,0L,0,0L,0,0L,0,0L,0,0L)), elem._2._2.getOrElse(Event(0,0L,0,0L,0,0L,0,0L,0,0L,0,0L,0,0L))))
}.updateStateByKey(updateState)
以及以下测试更新功能:
def updateState(newValues: Seq[(Event,Event)], state: Option[(Event,Event)]): Option[(Event, Event)] = {
Some((Event(0,0L,0,0L,0,0L,0,0L,0,0L,0,0L,0,0L), Event(0,0L,0,0L,0,0L,0,0L,0,0L,0,0L,0,0L)))
}
正如您所看到的,我简单地将一个新的空状态作为更新状态返回。但是,当运行此代码并过滤特定键以查看发生的情况时,该键将以看起来像无限循环的方式打印。这是代码:
joinViewClickDstream.foreachRDD { rdd =>
val avroMessage = convertToAvroMessage(message)
val trackingId = avroMessage.get("TrackingId").toString
if (trackingId.contains("MyUserId")) {
println(avroMessage)
}
如果我不使用updateStateByKey,我打印的所有东西看起来都很正常,但是使用updateStateByKey函数,我的userid会被无限期打印。还有其他人看到过这种行为吗?
P.S:我使用Spark 1.5.2,并且无法切换到1.6,因为我们的群集尚未升级。
编辑:预期输出
{"myuserid", result{....}}
打印一次。
相反,我看到了:
{"myuserid", result{....}}
{"myuserid", result{....}}
{"myuserid", result{....}}
{"myuserid", result{....}}
{"myuserid", result{....}}
....
无限期打印