Spark Streaming UpdateStateByKey在无限循环中?

时间:2016-05-02 19:00:10

标签: apache-spark streaming spark-streaming

我有以下代码加入来自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{....}}
....

无限期打印

0 个答案:

没有答案