【问题标题】:Spark streaming mapWithState timeout without removeSpark流式mapWithState超时而不删除
【发布时间】:2017-06-29 14:57:13
【问题描述】:

想象一个用例,其中每个用户都有事件流式传输,但只有第一周的事件是感兴趣的。在该时间范围内,使用 mapWithState 进行有状态逻辑。在那段时间之后,用户传入的事件应该被忽略。

由于用户的状态需要记忆,因此在用户的一周后将其更改为简单的已经看到的标记是有意义的。

如果在该用户的第一个事件一周或更晚后有任何事件发生,则可以轻松地将状态更改为该已看到标记。

但是,如果在那一周之后没有发生任何事件,则状态永远不会更改为那个已经看到的标记,并且状态将继续永远占用内存。

据我了解,添加超时(到用户状态)将无济于事,因为您不允许更改超时状态的状态(有意义,因为它将被删除)。

有没有简单的方法来实现这个用例?

【问题讨论】:

  • 据我了解,添加超时(到用户状态)将无济于事,因为您不允许更改超时状态的状态(有意义,因为它将被删除)。你能详细说明你的意思吗?如果状态已超时,则意味着在定义的时间段内没有新事件进入。
  • 确实超时意味着该用户一周内没有新事件进入,但这也意味着该用户的状态将被删除,这意味着他的下一个事件将被错误地视为他的第一个事件。我想要的不是要删除的状态,而是将其更新为已经看到的标记。不确定当前的 API 是否支持此用例...
  • 那么基本上你想要的是一个去重机制?如果一个用户已经被看到,你想丢弃他的所有数据吗?
  • 第一周之后发生的事件应该被丢弃,是的。
  • 我目前有2个想法来解决这个问题:1)随机生成一些假用户事件(具有随机用户ID)并将它们联合到批处理中(这样每个用户都可以保证得到一些事件第一周后)。 2)有两个mapWithState,首先只用于过期处理,其输出也将被联合到批处理中。只是想知道是否有更自然的方式

标签: spark-streaming


【解决方案1】:

据我了解,Spark 的 2.2 mapGroupsWithState 具有更丰富的超时时间,不仅可用于移除状态,还可用于更改状态(查看 here)。

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 2016-11-25
    • 2016-12-24
    • 1970-01-01
    • 2018-01-24
    • 2016-11-18
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多