如何在窗口化的 streaming-etl 中显示中间结果?

How to display intermediate results in a windowed streaming-etl?

我们目前在事件存储中实时聚合数据。这个想法是可视化多个时间范围(每月、每周、每天、每小时)和多个名义键的交易数据。我们经常有迟到的数据,所以我们需要考虑到这一点。此外,要求显示 "running" 结果,即当前 window 的值,甚至在它完成之前。

目前我们正在使用 Kafka 和 Apache Storm(特别是 Trident,即微批处理)来执行此操作。我们的架构大致是这样的:

(为我丑陋的照片道歉)。我们使用 MongoDB 作为键值存储来持久化状态,然后使微服务可以访问(只读)它 returns 查询的当前值。该设计存在多个问题

  1. 代码真是高维护
  2. 这种方式很难保证exactly-once处理
  3. 每次聚合后更新状态显然会对性能产生影响,但速度足够快。

我们的印象是,自从我们开始这个项目以来,有了 Apache Flink 或 Kafka 流,更好的框架(尤其是从维护的角度来看——Storm 往往非常冗长)已经可用。尝试这些似乎就像写入数据库一样,尤其是 mongoDB 不再是最先进的。我看到的标准用例是状态在 RocksDB 或内存中内部持久化,然后在 window 完成后写回 Kafka。

不幸的是,这使得显示中间结果变得相当困难,并且由于状态在内部持久化,我们需要允许的事件延迟按月或年的顺序排列。对于这种需求,有没有比劫持实时流状态更好的解决方案呢?我个人认为这是标准要求,但找不到标准解决方案。

您可以研究 Konstantin Knauf's Queryable Billing Demo 作为如何处理所涉及的一些问题的示例。那里使用的核心相关思想是:

  1. 在每个事件后触发 windows,以便他们的结果不断更新
  2. 使结果可查询(使用 Flink 的queryable state API

这是 Flink Forward 会议演讲的主题。 Video 可用。

您可以将 window 更新流式传输到仪表板或数据库,而不是使结果可查询。

另请注意,您可以级联 windows,这意味着每小时 windows 的结果可以作为每日 windows 等的输入

Kafka Streams 提供 "Interactive Queries"。和Flink的"queryable state"基本一样,只是没有像Flink中那样标记为"beta"

事实上,对于 Kafka Streams,正在进行的工作是 "Interactive Queries" 利用 Kafka Streams "standby tasks" (https://docs.confluent.io/current/streams/architecture.html#fault-tolerance)。

有关更多详细信息,请查看以下参考资料: