同步来自多个数据源的数据

时间:2019-05-27 12:57:59

标签: apache-kafka synchronization iot distributed-system stream-processing

我们的团队正在尝试建立一个预测性维护系统,该系统的任务是查看一组事件并预测这些事件是否描绘了一组已知异常。

我们正处于设计阶段,当前的系统设计如下:

  • 这些事件可能发生在物联网系统的多个来源(例如云平台,边缘设备或任何中间平台)上
  • 事件被数据源推送到消息队列系统中(当前我们选择了Apache Kafka)。
  • 每个数据源都有自己的队列(Kafka主题)。
  • 从队列中,数据被多个推理引擎(实际上是神经网络)使用。
  • 根据功能集,推理引擎将订阅 多个Kafka主题,并从这些主题中流式传输数据以连续输出推论。
  • 总体架构遵循单一职责原则,这意味着每个组件都将彼此分离并在单独的Docker容器中运行。

问题:

为了将一组事件分类为异常,这些事件必须在同一时间窗口内发生。例如例如,有三个数据源将各自的事件推送到Kafka主题中,但是由于某些原因,数据未同步。 因此,其中一个推理引擎会从每个kafka主题中提取最新条目,但是所提取数据中的相应事件并不属于同一时间窗口(例如1小时)。由于数据不同步,将导致无效的预测。

问题

我们需要弄清楚如何确保按顺序推送来自所有三个源的数据,以便当推理引擎从多个kakfa主题请求条目(例如最后100个条目)时,每个中的相应条目主题属于同一时间窗口?

4 个答案:

答案 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)

以下建议应使用时间序列数据最大程度地成功解决异常检测问题的事件同步。

  1. 在所有生产者/消费者节点上使用网络时间同步器
  2. 每隔x单位的时间使用生产者发出的心跳消息,并固定开始时间。例如:在分钟开始时每两分钟发送一次消息。
  3. 为生产者消息延迟构建预测器。使用心跳消息进行计算。

使用这些原语,我们应该能够对齐时间序列事件,并考虑由于网络延迟而导致的时间漂移​​。

在推理引擎端,在每个生产者级别扩展窗口,以在各个生产者之间同步事件。

答案 2 :(得分:0)

一些建议-

  1. 在生产者端处理延迟- 确保所有三个生产者始终使用batch.sizelinger.ms将数据同步发送到Kafka主题。 例如。如果linger.ms设置为1000,则所有消息都将在1秒内发送到Kafka。

  2. 在用户端处理延迟- 考虑到用户端的任何流引擎(Kafka流,Spark流,Flink),都提供了Windows功能以基于键加入/聚合流数据,同时考虑了延迟的窗口功能。

选中此项-Flink窗口以供参考,以了解如何选择正确的窗口类型link

答案 3 :(得分:0)

要处理这种情况,数据源必须提供某种机制让消费者意识到所有相关数据均已到达。最简单的解决方案是使用某种形式的批处理ID(Guid)从数据源发布一个批处理。消费者然后可以等待,直到出现下一个批次ID,以标记上一个批次的结束。此方法假定源不会跳过一批,否则它们将永久地未对准。没有算法可以检测到这种情况,但是数据中可能有一些字段显示不连续性并允许您重新对齐数据。

此方法的较弱版本是要么等待x秒,然后假设所有源都在这么长的时间内成功,要么查看某种形式的时间戳(逻辑或挂钟)以检测源已移至源。下一个时间窗口隐式显示最后一个窗口的完成。