Flink SQL窗口不报告最终结果 [英] Flink SQL Windows not Reporting Final Results

查看:16
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆