【问题标题】:Synchronize Data From Multiple Data Sources同步来自多个数据源的数据
【发布时间】:2019-05-27 12:57:59
【问题描述】:

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

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

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

问题:

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

问题

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

【问题讨论】:

  • 您提出了一个非常有趣的问题。也许this article 会引导您找到一些解决方案。

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


【解决方案1】:

我建议KSQL,这是一个流式 SQL 引擎,可以针对 Apache Kafka 进行实时数据处理。它还为窗口聚合等提供了很好的功能。

在KSQL中定义Windows有3种方式:

跳跃窗口、翻滚窗口和会话窗口。跳跃和 翻滚窗口是时间窗口,因为它们是由固定定义的 他们指定的持续时间。会话窗口是动态大小的 基于传入的数据并由活动周期定义 不活动的间隙。

在您的上下文中,您可以使用 KSQL 使用 Windowed Joins 查询和聚合感兴趣的主题。例如,

SELECT t1.id, ...
  FROM topic_1 t1
  INNER JOIN topic_2 t2
    WITHIN 1 HOURS
    ON t1.id = t2.id;

【讨论】:

    【解决方案2】:

    一些建议 -

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

    2. 在消费者端处理延迟 - 考虑到消费者端的任何流引擎(无论是 Kafka-stream、spark-stream、Flink),都提供了 windows 功能来基于键加入/聚合流数据,同时考虑延迟窗口功能。

    检查这个 - Flink windows 参考如何选择正确的窗口类型link

    【讨论】:

      【解决方案3】:

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

      此方法的较弱版本是仅等待 x 秒并假设所有源在这段时间内成功,或者查看某种形式的时间戳(逻辑或挂钟)以检测源已移动到next time 窗口隐式显示最后一个窗口的完成。

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

        • 感谢您的建议。您的解决方案非常合理,但是由于我对整个系统的了解有限,因此除了概念解决方案之外,我还在寻找一些实用的解决方案(可用于实现上述任务的工具)。
        • 对于网络时间同步,使用 NTP。这可以在节点启动或设备重新启动时完成。心跳消息可以发布到 Kafka 主题。您只需要 ProducerId、TimeStamp、ArrivalTimeStamp。消息的存在表示心跳。有关时间戳提取的讨论,请参阅:gerardnico.com/dit/kafka/timestamp
        • 消息延迟预测器可以使用与推理引擎相同的机器学习堆栈构建。由于可能会丢失消息,因此您需要考虑使用 Cox 比例风险等消息幸存者模型来确保准确性。
        猜你喜欢
        • 2018-11-10
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多