Spark mapWithState API说明

时间:2016-07-15 13:45:20

标签: scala apache-spark spark-streaming

我一直在Spark Streaming中使用mapWithState API,但有两件事情并不清楚StateSpec.function

让我们说我的功能是:

def trackStateForKey(batchTime: Time,
                     key: Long,
                     newValue: Option[JobData],
                     currentState: State[JobData]): Option[(Long, JobData)]
  1. 为什么新值为Option[T]类型?就我所见,它总是为我定义,并且因为该方法应该以新状态调用,所以我真的不明白为什么它可以是可选的。

  2. 返回值是什么意思?我试图在文档和源代码中找到一些指针,但没有一个描述它的用途。由于我使用state.remove()state.update()修改了某个键的状态,为什么我必须对返回值执行相同的操作?

    在我当前的实现中,如果我删除密钥,则返回None,如果我更新密码,则返回Some(newState),但我不确定这是否正确。

1 个答案:

答案 0 :(得分:18)

  

为什么新值为Option[T]类型?就我所见,它确实如此   总是为我定义,因为该方法应该被调用   对于一个新的国家,我真的不明白为什么会这样   可选的。

如果您使用Option[T]设置超时,则为StateSpec.timeout,例如:

StateSpec.function(spec _).timeout(Milliseconds(5000))

然后,一旦函数超时,传入的值将为None,而isTimingOut上的State[T]方法将为true。这是有道理的,因为状态的超时并不意味着已经为指定的密钥到达了一个新值,并且通常比null传递T更安全(这不会是&#39} ;无论如何都要为原语工作),因为您希望用户能够安全地操作Option[T]

你可以在Sparks实现中看到:

// Get the timed out state records, call the mapping function on each and collect the
// data returned
if (removeTimedoutData && timeoutThresholdTime.isDefined) {
  newStateMap.getByTime(timeoutThresholdTime.get).foreach { case (key, state, _) =>
    wrappedState.wrapTimingOutState(state)
    val returned = mappingFunction(batchTime, key, None, wrappedState) // <-- This.
    mappedData ++= returned
    newStateMap.remove(key)
  }
}
  

返回值是什么意思?我试图找到一些指针   文档和源代码,但没有一个描述它是什么   用于。因为我使用state.remove()修改键的状态   和state.update(),为什么我必须对返回做同样的事情   值?

返回值是一种沿着spark图传递中间状态的方法。例如,假设我想更新我的状态,但也使用中间数据在我的管道中执行某些操作,例如:

dStream
  .mapWithState(stateSpec)
  .map(optionIntermediateResult.map(_ * 2))
  .foreachRDD( /* other stuff */)

该返回值正是允许我继续操作所述数据的原因。如果您不关心中间结果并且只想要完整状态,那么输出None就完全没问了。

编辑:

我已经写了blog post(在此问题之后),试图对API进行深入解释。