Apache flink FLINK-SQL窗口是否会定期刷新元素以进行处理

Apache flink FLINK-SQL窗口是否会定期刷新元素以进行处理,apache-flink,flink-streaming,flink-cep,flink-sql,Apache Flink,Flink Streaming,Flink Cep,Flink Sql,我不知道翻滚窗口是否会按规则间隔计算并发出元素进行处理。例如,我有一个查询,它的工作时间间隔为10秒 select id, key from eventTable GROUP BY TUMBLE(rowTime, INTERVAL '10' SECOND), id, key ; 现在让我们假设:应用程序接收事件 E1@10:00:00 E2@10:00:05 E3@12:00:10 如您所见,E1和E2在5秒内到达,E3在@12:00:15到达 您能帮我确定E1和E2何时会被发射

我不知道翻滚窗口是否会按规则间隔计算并发出元素进行处理。例如,我有一个查询,它的工作时间间隔为10秒

select id, key from  eventTable  GROUP BY TUMBLE(rowTime, INTERVAL '10' SECOND), id, key ;

现在让我们假设:应用程序接收事件

  • E1@10:00:00
  • E2@10:00:05
  • E3@12:00:10

如您所见,E1和E2在5秒内到达,E3在@12:00:15到达

  • 您能帮我确定E1和E2何时会被发射进行处理吗?会是@10:00:11吗?或者E3何时到来,然后query将评估窗口并发出
  • 如果是在E3之后,那么有没有办法确保每10秒执行一次查询

感谢您在这方面的帮助。

如果您使用的是事件时间处理,则当水印超过10:00:10时,将发出在10:00:10结束的窗口。如果水印是以通常的无序绑定方式进行的,并且如果没有其他事件,则水印在E3处理之前不会前进

如果您需要考虑空闲性的水印策略,我相信您唯一的选择是使用DataStream API创建流,然后

请注意,
.withIdleness(…)
所做的是将流标记为空闲,这样可以防止该流保留水印。这解决了如果存在其他活动流,则一个空闲流会阻止整个作业的问题。如果您希望水印在完全没有发生任何事情的情况下进行,则需要采取更激烈的措施


理想的解决方案是保留来自同一来源的消息,这样您就知道空闲是真实的,而不是中断。如果不能做到这一点,请参见如何使用计时器检测空闲并根据时间的推移而不是新事件的到来推进水印的示例。(请注意,此示例尚未更新为使用新的
水印策略
界面。)

您可以配置tableEnv让table提前发出:

 TableConfig config = bbTableEnv.getConfig();
 config.getConfiguration().setBoolean("table.exec.emit.early-fire.enabled", true);
 config.getConfiguration().setString("table.exec.emit.early-fire.delay", "1s");

感谢David,我尝试使用TimestampAssigner((eventResponse,l)->eventResponse.getRowTime().getTime())实现WatermarkStrategy wmStrategy=WatermarkStrategy.forBoundedAutoforderness(Duration.ofMillis(10))。withIdleness(Duration.ofMinutes(1));但不起作用,最后两个事件永远不会触发,因为源是空闲的,水印过程也不会发生。我已经扩展了我的答案,来解释我认为在你们的案例中发生了什么。