Apache flink 如何按事件时间连接实时流和延迟流

Apache flink 如何按事件时间连接实时流和延迟流,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在尝试使用协处理函数连接两个流。其中一个输入流A实时生成。但是,另一个输入流B由一个具有1天延迟的每日计划作业加载,这意味着今天放入流中的事件始终具有从昨天开始的事件时间 也就是说,流B的水印总是比A的水印晚1天,所以我可以想象A的很多事件都会被缓冲在内存中。我想知道是否有办法解决这个问题。另外,流A和流B都是运动流(我使用的是FlinkKinesisConsumer),保留期为7天 提前谢谢 如果您在缓冲多个元素时担心内存问题,那么您应该查看各种不同的SDB。这样,状态将保留在磁盘上,而不

我正在尝试使用
协处理函数
连接两个流。其中一个输入流A实时生成。但是,另一个输入流B由一个具有1天延迟的每日计划作业加载,这意味着今天放入流中的事件始终具有从昨天开始的事件时间

也就是说,流B的水印总是比A的水印晚1天,所以我可以想象A的很多事件都会被缓冲在内存中。我想知道是否有办法解决这个问题。另外,流A和流B都是运动流(我使用的是
FlinkKinesisConsumer
),保留期为7天


提前谢谢

如果您在缓冲多个元素时担心内存问题,那么您应该查看各种不同的SDB。这样,状态将保留在磁盘上,而不是内存中


这应该可以很容易地解决您在一天内面临的缓冲元素问题,因为限制状态大小的唯一因素是可用磁盘空间,这通常很便宜,在大多数情况下不应该是问题。

因为Flink 1.8.1 Flink Kinesis consumer支持事件时间对齐(有选择地从拆分中读取数据,以确保各种消费者在活动时间内均匀前进)。有关详细信息,请参阅

Flink社区正在致力于为跨源的事件时间同步提供更通用的支持,以便在这样的情况下,在源之间存在严重的事件时间不一致的情况下,能够有效地实现事件时间连接。目前唯一的解决方案(除非您使用的是Kinesis)使用Flink状态来缓冲前面的流,这可能会导致非常大的检查点和显著的反压力


通用事件时间对齐的基础正在作为/的一部分实施,之后必须重新处理源以利用这一新机制。

我认为您面临的情况实际上可能不是一个问题,假设您的“快速”流是通过类似卡夫卡(Kafka)的东西进入的,它可以作为缓冲区并保留消息。(如果不是这样,那么在加入之前直接向卡夫卡写信,自己创建这种情况)

虽然我没有测试它,但我希望在Flink中可用的缓冲区已满之前,快速流将被接收。在这一点上,它将简单地停止或减慢接收,直到第二个慢速流进入,以“清理”所有等待加入的消息,然后快速流可以再次开始移动


请注意,这可能需要两个流中的消息以大致相同的顺序出现。

您能告诉更多信息/也许可以提供一个连接的示例吗?您想从B将时间戳与相等/较低的时间戳连接起来吗?当然,只需给出一个简化的示例:两个流中的事件都有一个字段
dataId
,因此对于gi来说流B中的ven事件
X
(延迟事件),我想在流A中找到0个或多个事件,这些事件具有相同的
dataId
,并且事件时间不晚于事件
X
的事件时间后5分钟。该机制的期望值是什么?您不需要任何缓冲?我知道未处理的事件将在内存中缓冲,在我的情况下,来自str的事件也将被缓冲当天生成的eam A将被缓冲。我只是担心应用程序可能会耗尽内存并崩溃。感谢您提供的信息!我阅读了“事件时间对齐”部分,我的理解是我可以控制如何在同一动觉流中跨不同碎片同步多个水印,但需要同步在多个运动流中,除了在Flink状态下进行缓冲外,我还可以如何处理消耗率?