>我正在尝试使用CoProcessFunction
加入 2 个流。其中一个输入流 A 是实时生成的。但是,另一个输入流 B 由每日计划作业加载,延迟 1 天,这意味着今天放入流中的事件始终具有昨天的事件时间。
话虽如此,流 B 的水印将始终比 A 的水印晚 ~1 天,所以我可以想象来自 A 的许多事件都会缓冲在内存中。我想知道是否有解决问题的方法。一些额外的背景,流 A 和 B 都是 kinesis 流(我正在使用FlinkKinesisConsumer
(,保留期 = 7 天。
提前感谢!
如果你担心缓冲多个元素时的内存,那么你应该看看各种不同的状态后端,尤其是RocksDb。这样,状态将保留在磁盘上,而不是内存中。
这应该很容易解决您一天面临的缓冲元素问题,因为唯一限制状态大小的是可用的磁盘空间,这通常很便宜,在大多数情况下应该不是问题。
从 Flink 1.8.1 开始,Flink Kinesis 消费者支持事件时间对齐(有选择地从拆分中读取,以确保各种消费者在事件时间中均匀前进(。有关详细信息,请参阅分片使用者的事件时间对齐。
Flink 社区正在努力为跨源的事件时间同步提供更通用的支持,以便在源之间存在严重事件时间不一致的情况下,可以有效地实现事件时间连接。目前唯一的解决方案(除非您使用的是 Kinesis(是使用 Flink 状态来缓冲前面的流,这可能会导致非常大的检查点和明显的背压。
通用事件时间对齐的基础正在作为 FLIP-27/FLINK-10740 的一部分实现,之后必须重新设计源以利用这种新机制。
我认为您面临的情况实际上可能不是问题,假设您的"快速"流是通过 Kafka 之类的东西进入的,它可以充当缓冲区并保留消息。(如果不是这种情况,在加入之前写信给Kafka应该很简单,自己创造这种情况(
虽然我没有测试它,但我希望快速流被摄取,直到 Flink 中可用的缓冲区已满。此时,它将简单地停止或减慢摄取,直到第二个慢流进入以"清理"所有等待加入的消息,之后快速流可以再次开始移动。
请注意,这可能需要两个流中的消息以大致相同的顺序发送。