存储无界流的元素 X 直到 Y 元素到达,然后加入它们

Store an element X of an unbounded stream until the Y element arrives, then join them

我想知道使用Apache Flink是否可以解决以下问题。

假设我有一个包含两个 table 的数据库:“clients”和“orders”。 “orders”table 包含一个名为“client_id_fk”的外键,它引用“ 客户”table,称为“client_id”。现在,假设我捕获了 table 上发生的事件,例如 insertsupdates deletes,我将所有这些传递给一个无界的 Flink DataStream。当事件进入 Flink DataStream 时,它将它们写入另一个存储,例如Apache Kafka 主题。

假设在“clients”里面新增了5条记录:A, B, C, D, E,并且Flink DataStream 以精确的顺​​序接收这些记录。现在,假设在“orders”中添加了记录O_A,引用A 客户;然后,这个事件也被推送到 Flink DataStream 中。正如我之前所描述的,每个事件到达 DataStream 时都会直接写入 Kafka 主题;我的问题来了:在 Apache Flink 中有没有办法 store 事件 A 直到事件 O_A 到了,然后 join 他们,然后把他们写在 Kafka 主题里面?显然,我知道我必须等待 O_A 才能在主题中写入 A

回顾一下,Flink DataStream 按以下顺序接收以下事件:

A、B、C、D、E、O_A

当它接收到事件A,而不是将其写入Apache Kafka主题中,它应该存储它并等待事件O_A到了;然后,它加入它们,然后将它们写在主题中。

我提前谢谢大家,是否也可以使用 Java Apache Flink API 编写一个直观的片段来说明如何实现这一点?

是的,这当然可以通过 Flink 实现。使用 DataStream API,您可以通过 client_id 键控客户端流和 client_id_fk 键控订单流,并使用 KeyedCoProcessFunction 连接这两个键控流来实现此目的。在此运算符中,您将使用键控状态来存储客户记录,直到订单到达。

Flink Training from Ververica includes a couple of examples of how to implement a join that is pretty much the same -- you'll those examples here and here, but to better understand them, I recommend starting from the beginning.