在Kafka中重新创建Kinesis交错窗口

时间:2019-05-07 15:52:16

标签: apache-kafka apache-kafka-streams amazon-kinesis

AWS Kinesis提供了流窗口实施,可帮助“分析不一致时间到达的数据组”,stagger windows

这样的窗口实现特别强大,因为它确保仅在接收到第一个事件(由事件分组定义)时才启动窗口,并在固定时间后完成,从而减少了紧接彼此接收的事件数量,最终出现在单独的窗口中。

Kinesis似乎是快速简便地实现流选择的绝佳选择,但为了回顾潜在的未来“锁定”,我们试图了解如何在必要时使用Kafka流重新创建类似的功能。

Kafka streams似乎支持以下窗口功能:

根据我们现有的研究,会话窗口可能是最接近 stagger 的选项。但是,我们注意到,即使延迟的事件到来,会话窗口仍可以被“更新”,否则该会话将被视为“过期/已发射”,并且会话可能直到将来的“流时间”事件才发出被记录?

因此,我想问一个问题:错开窗口的最接近实现是否在Kafka中,以及应该注意哪些潜在的“陷阱”。

1 个答案:

答案 0 :(得分:2)

会话窗口可能有些相似,但是会话窗口没有固定的大小。窗口边界由“ gap”参数确定。以Amazon文档为例,前两个事件(分别称为A和B)相距10秒,第二个和第三个(C)相距35秒,第三个和第四个(D)相距10秒。如果将间隔指定为10秒,则将获得两个窗口A,B和C,D,这两个窗口分别不同于翻滚窗口和交错窗口。如果您在35秒内指定间隔,则将获得一个包含所有4个事件的窗口。

根据您的用例,它可能仍可以在会话窗口中使用。

  

但是我们注意到,即使迟到的事件到来,会话窗口仍可以“更新”,否则该会话将被视为“过期/发出”,

是的,这是正确处理乱序记录所必需的。我不确定Kinesis对事件时间的支持是什么-似乎它们的滚动窗口与ROWTIME(这是挂钟时间?)对齐。但是,使用separate_rows(all_faults,"Data",sep = ",") ,您可以在每个会话中仅获得一个结果(通过权衡一些处理延迟)。请查看此博客文章以了解更多详细信息:https://www.confluent.io/blog/kafka-streams-take-on-watermarks-and-triggers

  

还有在记录将来的“流时间”事件之前可能不会发出会话吗?

是的。但是,只有在根本没有新数据到达的情况下,才会发生这种情况,对于具有连续数据流的流处理应用程序,情况就不会如此。

使用suppress()和窗口状态存储来实现自己想要的逻辑,您还可以做些什么。使用壁钟时间标点符号,即使没有新的输入数据到达,也可以确保发送数据。最具挑战性的部分将是处理此案的乱序记录。