Flink SQL窗口不报告最终结果 [英] Flink SQL Windows not Reporting Final Results
本文介绍了Flink SQL窗口不报告最终结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用Flink SQL来计算基于事件时间的窗口化分析。一切都很正常,直到我的数据源每天晚上变得空闲,之后直到第二天数据再次开始流动时才会产生最后一分钟的结果。
CREATE TABLE input
id STRING,
data BIGINT,
rowtime TIMESTAMP(3) METADATA FROM 'timestamp',
WATERMARK FOR rowtime AS rowtime - INTERVAL '1' SECOND
WITH (
'connector' = 'kafka',
'topic' = 'input',
'properties.bootstrap.servers' = 'localhost:9092',
'scan.startup.mode' = 'latest-offset',
'format' = 'json'
)
SELECT ...
FROM
(SELECT * FROM
TABLE(TUMBLE(TABLE input, DESCRIPTOR(rowtime), INTERVAL '1' MINUTES)))
GROUP BY ..., window_start, window_end
我已尝试设置table.exec.source.idle-timeout
,但无济于事。我能做些什么?
推荐答案
table.exec.source.idle-timeout
(以及与Datastream API for WatermarkStrategy一起使用的相应withIdleness
构造)检测空闲的输入分区,并防止它们阻碍整个水印的进度。但是,要使整体水印前进,必须在某处仍有一些输入。
一些选项:
(1)接受问题,即根据观察到输入流中较大的时间戳,等待水印能够正常推进。正如您已经指出的,在您的用例中,这可能需要等待几个小时。
(2)安排输入流包含保活消息。这样,水印生成器将具有它可以推进水印的证据(基于保活消息中的时间戳)。您必须修改查询以忽略这些原本无关的事件。(3)到达作业已完全吸收所有日常输入,但尚未生成最终结果集时,stop the job并指定--drain
。这将通过管道发送一个值为MAX_WATERMARK的水印,这将关闭所有挂起的窗口。然后您可以重新启动该作业。
(4)实现自定义水印策略,使用处理时间定时器检测空闲,并根据挂钟时间的流逝人工提前水印。这将需要将表输入转换为数据流,在那里添加水印,然后转换回用于窗口的表。有关这些转换的示例,请参阅https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/dev/table/data_stream_api/。
这篇关于Flink SQL窗口不报告最终结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文