Scala 在Spark Streaming中使用mapWithState指定超时
我正在跟踪一个消息 trackstatefunction的代码如下:Scala 在Spark Streaming中使用mapWithState指定超时,scala,apache-spark,spark-streaming,Scala,Apache Spark,Spark Streaming,我正在跟踪一个消息 trackstatefunction的代码如下: def trackStateFunc(batchTime: Time, key: String, value: Option[Int], state: State[Long]): Option[(String, Long)] = { val sum = value.getOrElse(0).toLong + state.getOption.getOrElse(0L) val output = (key, sum)
def trackStateFunc(batchTime: Time, key: String, value: Option[Int], state: State[Long]): Option[(String, Long)] = {
val sum = value.getOrElse(0).toLong + state.getOption.getOrElse(0L)
val output = (key, sum)
state.update(sum)
Some(output)
}
当state超时时,我遇到了一个问题(state.isTimingout()==true)
,然后函数再次更新state,这可能会导致异常。这对样品是真的吗
如果状态为超时(state.isTimingout()==true
),则函数会再次更新状态,这可能会导致异常
是的,没错。如果在mapWithState
上设置显式超时,并在状态处于最后一次超时迭代时调用state.update
,将导致引发异常,因为一旦发生超时,就无法更新状态。这是明确规定的:
如果状态已被删除(即,
remove()已被调用)或由于
超时(即,isTimingOut()
为真)。
在您的示例中,需要进行额外检查:
def trackStateFunc(batchTime: Time,
key: String,
value: Option[Int],
state: State[Long]): Option[(String, Long)] = {
val sum = value.getOrElse(0).toLong + state.getOption.getOrElse(0L)
val output = (key, sum)
if (!state.isTimingOut) state.update(sum)
Some(output)
}
或者,由于超时发生后,value
应仅为None
,因此也可以使用模式匹配:
def trackStateFunc(batchTime: Time,
key: String,
value: Option[Int],
state: State[Long]): Option[(String, Long)] = {
value match {
case Some(v) =>
val sum = v.toLong + state.getOption.getOrElse(0L)
state.update(sum)
Some((key, sum))
case _ if state.isTimingOut() => (key, state.getOption.getOrElse(0L))
}
}
有关有状态流的回顾,请参阅(免责声明:我是作者)。hi@Yuval,那么如果某个键超时,所有状态都消失了?你需要从头开始吗?@marios是的,超时过后,密钥被标记为删除。我想如果你需要在超时后保持状态,你需要自己做吗?谢谢你,尤瓦尔!