【发布时间】:2017-06-29 14:57:13
【问题描述】:
想象一个用例,其中每个用户都有事件流式传输,但只有第一周的事件是感兴趣的。在该时间范围内,使用 mapWithState 进行有状态逻辑。在那段时间之后,用户传入的事件应该被忽略。
由于用户的状态需要记忆,因此在用户的一周后将其更改为简单的已经看到的标记是有意义的。
如果在该用户的第一个事件一周或更晚后有任何事件发生,则可以轻松地将状态更改为该已看到标记。
但是,如果在那一周之后没有发生任何事件,则状态永远不会更改为那个已经看到的标记,并且状态将继续永远占用内存。
据我了解,添加超时(到用户状态)将无济于事,因为您不允许更改超时状态的状态(有意义,因为它将被删除)。
有没有简单的方法来实现这个用例?
【问题讨论】:
-
据我了解,添加超时(到用户状态)将无济于事,因为您不允许更改超时状态的状态(有意义,因为它将被删除)。你能详细说明你的意思吗?如果状态已超时,则意味着在定义的时间段内没有新事件进入。
-
确实超时意味着该用户一周内没有新事件进入,但这也意味着该用户的状态将被删除,这意味着他的下一个事件将被错误地视为他的第一个事件。我想要的不是要删除的状态,而是将其更新为已经看到的标记。不确定当前的 API 是否支持此用例...
-
那么基本上你想要的是一个去重机制?如果一个用户已经被看到,你想丢弃他的所有数据吗?
-
第一周之后发生的事件应该被丢弃,是的。
-
我目前有2个想法来解决这个问题:1)随机生成一些假用户事件(具有随机用户ID)并将它们联合到批处理中(这样每个用户都可以保证得到一些事件第一周后)。 2)有两个mapWithState,首先只用于过期处理,其输出也将被联合到批处理中。只是想知道是否有更自然的方式
标签: spark-streaming