我们的团队正在尝试建立一个预测性维护系统,该系统的任务是查看一组事件并预测这些事件是否描绘了一组已知异常。
我们正处于设计阶段,当前的系统设计如下:
为了将一组事件分类为异常,这些事件必须在同一时间窗口内发生。例如例如,有三个数据源将各自的事件推送到Kafka主题中,但是由于某些原因,数据未同步。 因此,其中一个推理引擎会从每个kafka主题中提取最新条目,但是所提取数据中的相应事件并不属于同一时间窗口(例如1小时)。由于数据不同步,将导致无效的预测。
我们需要弄清楚如何确保按顺序推送来自所有三个源的数据,以便当推理引擎从多个kakfa主题请求条目(例如最后100个条目)时,每个中的相应条目主题属于同一时间窗口?
答案 0 :(得分:1)
我建议使用KSQL,它是一种流SQL引擎,可以针对Apache Kafka进行实时数据处理。它还为Windowed Aggregation等提供了很好的功能。
有3种方法可以在KSQL中定义Windows:
跳跃窗口,翻滚窗口和会话窗口。跳频和 滚动窗口是时间窗口,因为它们是由固定的定义的 您指定的持续时间。会话窗口的大小是动态的 基于传入数据并由活动时间间隔定义 闲置的差距。
在您的上下文中,您可以使用Windowed Joins使用KSQL查询和聚合感兴趣的主题。例如,
SELECT t1.id, ...
FROM topic_1 t1
INNER JOIN topic_2 t2
WITHIN 1 HOURS
ON t1.id = t2.id;
答案 1 :(得分:1)
以下建议应使用时间序列数据最大程度地成功解决异常检测问题的事件同步。
使用这些原语,我们应该能够对齐时间序列事件,并考虑由于网络延迟而导致的时间漂移。
在推理引擎端,在每个生产者级别扩展窗口,以在各个生产者之间同步事件。
答案 2 :(得分:0)
一些建议-
在生产者端处理延迟-
确保所有三个生产者始终使用batch.size
和linger.ms
将数据同步发送到Kafka主题。
例如。如果linger.ms设置为1000,则所有消息都将在1秒内发送到Kafka。
在用户端处理延迟- 考虑到用户端的任何流引擎(Kafka流,Spark流,Flink),都提供了Windows功能以基于键加入/聚合流数据,同时考虑了延迟的窗口功能。
选中此项-Flink窗口以供参考,以了解如何选择正确的窗口类型link
答案 3 :(得分:0)
要处理这种情况,数据源必须提供某种机制让消费者意识到所有相关数据均已到达。最简单的解决方案是使用某种形式的批处理ID(Guid)从数据源发布一个批处理。消费者然后可以等待,直到出现下一个批次ID,以标记上一个批次的结束。此方法假定源不会跳过一批,否则它们将永久地未对准。没有算法可以检测到这种情况,但是数据中可能有一些字段显示不连续性并允许您重新对齐数据。
此方法的较弱版本是要么等待x秒,然后假设所有源都在这么长的时间内成功,要么查看某种形式的时间戳(逻辑或挂钟)以检测源已移至源。下一个时间窗口隐式显示最后一个窗口的完成。