Scala 在Spark Streaming中使用mapWithState指定超时

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)

我正在跟踪一个消息

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)
  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是的,超时过后,密钥被标记为删除。我想如果你需要在超时后保持状态,你需要自己做吗?谢谢你,尤瓦尔!