【问题标题】:Spark streaming maintain state over windowSpark 流在窗口上保持状态
【发布时间】:2018-03-02 19:10:35
【问题描述】:

对于火花流,有没有办法只为当前窗口维护状态?我知道updateStateByKey 有效,但除非我们清除它,否则它会永远保持状态。是否可以存储和重置每个窗口的状态?

提供更多上下文。我正在尝试将一种类型的对象转换为窗口流中的另一种类型。但是,转换如下:

对象 1 是调用或响应。

在我们同时看到调用和响应之前,对象 2 不被认为是完整的。

但是,由于对象的响应可能在单独的批次中,我需要跨批次维护状态。

但我只想保持当前窗口的状态。有什么方法可以通过 spark 实现这一点。

谢谢!

【问题讨论】:

    标签: java apache-spark spark-streaming


    【解决方案1】:

    您可以使用 mapWithState 转换而不是 updateStateByKey,并且可以将超时设置为具有批处理间隔的持续时间的状态规范。通过这种方式,您每次只能获得最后一批的状态。但如果您调用它,它将起作用并且响应仅取决于最后一批。否则,当您尝试更新已删除的密钥时,它将引发异常。 与 updateStateByKey 相比,MapwithState 的性能更快。

    您可以在下面找到示例代码 sn-p。

    import org.apache.spark.streaming._
    val stateSpec =
      StateSpec
        .function(updateUserEvents _)
        .timeout(Minutes(5))
    

    【讨论】:

    • 有没有办法在窗口期间保持这个?我希望将其用于滑动窗口。从您所描述的到期情况来看,您似乎无法处理滑动窗口?
    • 作为额外的跟进。我们能否返回一个只包含一个 RDD 的 mapwithstate 流的窗口版本?
    • 因此,如果您将超时设置为窗口时间,它将始终拥有一个窗口的数据
    猜你喜欢
    • 2016-04-10
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多