Apache Flink - SQL Kafka 连接器 事件时间上的水印不会拉取记录



我有一个类似于Apache Flink翻滚窗口延迟结果的问题。不同的是,我使用的SQL使用kafka连接来读取主题中的记录。我定期得到记录,但不知怎么的,我没有得到输出中的最后几条记录。例如,Kafka主题中的最后一条记录的时间戳为2020-11-26T13:11:36.605Z,聚合值的最后一个时间戳是2020-11-26CT12:59:59.999。我不明白为什么我没有得到主题中最后一条记录的汇总。请帮忙。这是我的密码。

sourceSQL = "CREATE TABLE flink_read_kafka (clientId INT, orderId INT, contactTimeStamp, WATERMARK FOR contactTimeStamp AS contactTimeStamp - INTERVAL '5' SECOND with (kafka config) ";
sinkSQL = "CREATE TABLE flink_aggr_kafka (contactTimeStamp STRING, clientId INT, orderCount BIGINT) with (kafka config) ";
aggrSQL = "insert into flink_aggr_kafka SELECT TUMBLE_ROWTIME(contactTimeStamp, INTERVAL '5' MINUTE) as contactTimeStamp, clientId, COUNT(*) orderCount from flink_read_kafka GROUP BY clientId , TUMBLE(commsTimestamp, INTERVAL '5' MINUTE)";
blinkStreamTableEnv.executeSql(sourceSQL);
blinkStreamTableEnv.executeSql(sinkSQL);
blinkStreamTableEnv.executeSql(aggrSQL);

首先,一些背景:只有当水印超过窗口的最大时间戳时,翻滚窗口才会发出结果。水印向框架指示具有较低时间戳的所有记录都已到达,因此窗口是完整的,并且可以发出结果。

水印只能根据传入记录的时间戳进行推进,因此,如果没有更多的记录传入,水印将不会推进,当前打开的窗口也不会关闭。因此,当数据不再涌入时,预计最后一个窗口将保持打开状态。

在您的示例中,通常会假设行时间为2020-11-26T13:04:59.999和26T13:09:59.999的窗口也会被发射,因为最新的记录应该已经将水印推到了这些时间戳之外。

我现在能想到两个原因,为什么情况可能不是这样:

  • 并非所有并行源实例的时间戳都高于26T13:05:04.999,因此输出水印实际上没有超过该值。您可以通过以1的并行度运行作业来测试这一点,这将减轻问题,或者通过检查Flink Web UI中窗口运算符的水印来验证是否存在这种情况。

  • 如果您在一次模式下使用Kafka生产者,并且只使用已委托的记录,则只有在窗口启动后检查点完成后,这些记录才会变得可见。

相关内容

  • 没有找到相关文章

最新更新