我有一个特定的任务,使用带有一些附加逻辑的Apache Flink
将两个数据流连接到一个聚合中。
基本上我有两个数据流:事件流和所谓的meta-events
流。我使用Apache Kafka
作为消息主干。我试图实现的是根据meta-event
中提供的信息触发评估aggregation/window
。基本方案是:
- 事件的数据流开始发出
Type A
的记录; - 记录在基于某个键的某个聚合或窗口中不断累积;
- 元事件数据流接收一个带有给定键的新
meta-event
,该键还定义了将在事件数据流中发出的事件总量。 - 构成步骤的事件数
3
成为聚合的触发条件。在具有给定键的Type A
个事件总数等于具有给定键的meta-event
中定义的数后,应触发聚合以进行评估。
步骤1
和3
按非确定性顺序发生,因此可以重新排序。
我尝试的是分析Flink Global Windows
,但不确定这是否是一个好的和适当的解决方案。我也不确定这样的问题是否有解决方案Apache Flink
.
任何可能的帮助都非常感谢。
简单的答案是.connect()
两个流,在每个流中keyBy()
相应的字段,然后将它们运行到自定义KeyedCoProcessFunction
中。您将当前聚合结果和计数保存在左侧 (Type A
( 流状态中,将目标计数保存在右侧 (meta-event
( 流状态中,并在聚合计数 == 目标计数时生成结果。
但是这里有一个问题 - 如果在获取该键的meta-event
记录之前在Type A
流中获取 N 条记录,并且目标计数> N 条记录,会发生什么情况?从本质上讲,您要么必须保证不会发生这种情况,要么需要缓冲Type A
事件(处于状态(,直到获得meta-event
记录。
当然,如果可以将meta-event
目标更改为较小的值,则可能会出现类似的情况。