在 Kafka 中重新创建 Kinesis stagger window
Recreating Kinesis stagger window in Kafka
AWS Kinesis 提供流 windowing 实施,有助于 "analyzing groups of data that arrive at inconsistent times"、stagger windows。
这样的 window 实现特别强大,因为它确保 window 仅在收到第一个事件(由事件分组定义)时开始,并在固定时间后结束,从而减少事件的数量,一个接一个地接踵而至,在单独的 windows.
中结束
Kinesis 似乎是一个快速简单的流实现选择的绝佳选择,但为了回顾潜在的未来 'lock-in' 我们正在尝试了解我们如何重新创建类似的功能,如果需要,使用卡夫卡流。
Kafka streams 似乎支持以下 windowing 函数:
- 翻滚(对比 Kinesis Tumbling)
- 跳跃(相对于没有 Kinesis 实现)
- 滑动(对比 Kinesis Sliding)
- 会话数(与?)
根据我们现有的研究 session windows 可能是最接近 stagger 的选项。然而,我们注意到,如果延迟事件到达,即使在该会话将被视为 'expired/emitted' 之后,会话 windows 仍然可以是 'updated',并且会话可能不会被发出,直到未来 'stream time' 事件被记录?
因此,我想问一下 what/if 交错 window 最接近的实现可能在 Kafka 中,并且需要注意哪些潜在 'gotchas' 很重要。
Session windows 可能有些类似,但是,Session windows 没有固定大小。 Window 边界由 "gap" 参数确定。以 Amazon 文档为例,前两个事件(我们称它们为 A 和 B)相隔 10 秒,第二个和第三个 (C) 35 秒,第三个和第四个 (D) 10 秒。如果您指定 10 秒的间隔,您将得到 A、B 和 C、D 的两个 windows,这与翻滚不同,与错开不同 windows。如果您指定间隔 35 秒,您会得到一个包含所有 4 个事件的 window。
根据您的用例,它可能仍然可以使用会话 windows。
What we've noticed however that session windows can still be 'updated' if a late event arrives even after that session would otherwise have been considered 'expired/emitted',
是的,这是正确处理 out-of-order 记录所必需的。我不确定 Kinesis 中对 event-time 的支持是什么——它们的翻滚 windows 似乎与 ROWTIME 对齐(这是 wall-clock 时间?)。但是,使用 suppress()
,您可以在每个会话中恰好获得一个结果(通过权衡一些处理延迟)。查看此博客 post 了解更多详情:https://www.confluent.io/blog/kafka-streams-take-on-watermarks-and-triggers
and also that sessions may not be emitted until future 'stream time' events are recorded?
没错。但这只会发生,如果根本没有新数据到达,对于具有连续数据流的流处理应用程序来说不应该出现这种情况。
您还可以使用 transform()
和 windowed-state 商店来实现您想要的逻辑。使用 wall-clock 时间标点符号,您还可以确保即使没有新的输入数据到达也能发出数据。最具挑战性的部分是处理本案例的 out-of-order 条记录。
AWS Kinesis 提供流 windowing 实施,有助于 "analyzing groups of data that arrive at inconsistent times"、stagger windows。
这样的 window 实现特别强大,因为它确保 window 仅在收到第一个事件(由事件分组定义)时开始,并在固定时间后结束,从而减少事件的数量,一个接一个地接踵而至,在单独的 windows.
中结束Kinesis 似乎是一个快速简单的流实现选择的绝佳选择,但为了回顾潜在的未来 'lock-in' 我们正在尝试了解我们如何重新创建类似的功能,如果需要,使用卡夫卡流。
Kafka streams 似乎支持以下 windowing 函数:
- 翻滚(对比 Kinesis Tumbling)
- 跳跃(相对于没有 Kinesis 实现)
- 滑动(对比 Kinesis Sliding)
- 会话数(与?)
根据我们现有的研究 session windows 可能是最接近 stagger 的选项。然而,我们注意到,如果延迟事件到达,即使在该会话将被视为 'expired/emitted' 之后,会话 windows 仍然可以是 'updated',并且会话可能不会被发出,直到未来 'stream time' 事件被记录?
因此,我想问一下 what/if 交错 window 最接近的实现可能在 Kafka 中,并且需要注意哪些潜在 'gotchas' 很重要。
Session windows 可能有些类似,但是,Session windows 没有固定大小。 Window 边界由 "gap" 参数确定。以 Amazon 文档为例,前两个事件(我们称它们为 A 和 B)相隔 10 秒,第二个和第三个 (C) 35 秒,第三个和第四个 (D) 10 秒。如果您指定 10 秒的间隔,您将得到 A、B 和 C、D 的两个 windows,这与翻滚不同,与错开不同 windows。如果您指定间隔 35 秒,您会得到一个包含所有 4 个事件的 window。
根据您的用例,它可能仍然可以使用会话 windows。
What we've noticed however that session windows can still be 'updated' if a late event arrives even after that session would otherwise have been considered 'expired/emitted',
是的,这是正确处理 out-of-order 记录所必需的。我不确定 Kinesis 中对 event-time 的支持是什么——它们的翻滚 windows 似乎与 ROWTIME 对齐(这是 wall-clock 时间?)。但是,使用 suppress()
,您可以在每个会话中恰好获得一个结果(通过权衡一些处理延迟)。查看此博客 post 了解更多详情:https://www.confluent.io/blog/kafka-streams-take-on-watermarks-and-triggers
and also that sessions may not be emitted until future 'stream time' events are recorded?
没错。但这只会发生,如果根本没有新数据到达,对于具有连续数据流的流处理应用程序来说不应该出现这种情况。
您还可以使用 transform()
和 windowed-state 商店来实现您想要的逻辑。使用 wall-clock 时间标点符号,您还可以确保即使没有新的输入数据到达也能发出数据。最具挑战性的部分是处理本案例的 out-of-order 条记录。