【发布时间】:2021-11-04 11:38:08
【问题描述】:
对于 Flik Kafka SQL 源定义:
CREATE TABLE PlayEvents (
`event_time` TIMESTAMP(3) METADATA FROM 'timestamp',
`the_kafka_key` STRING,
`song_id` BIGINT NOT NULL,
`duration` BIGINT,
WATERMARK FOR `event_time` AS `event_time` - INTERVAL '1' SECONDS
) WITH (
'connector' = 'kafka',
'topic' = 'play-events',
'properties.bootstrap.servers' = 'localhost:29092',
'key.format' = 'raw',
'key.fields' = 'the_kafka_key',
'value.format' = 'avro-confluent',
'value.avro-confluent.url' = 'http://localhost:8081',
'value.fields-include' = 'EXCEPT_KEY',
'scan.startup.mode' = 'earliest-offset'
)
测试PlayEvent 消息每100ms 发送到play-events
使用 Avro 格式:
protocol `protocol` {
record PlayEvent {
long song_id;
long duration;
}
}
我正在运行一个连续的Window Top-N 查询:
Configuration strConf = new Configuration();
strConf.setInteger(RestOptions.PORT, 8089);
strConf.setString(RestOptions.BIND_PORT, "8088-8090");
StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment(strConf);
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
Configuration tableConfiguration = tableEnv.getConfig().getConfiguration();
tableConfiguration.setString("table.exec.source.idle-timeout", "2 min");
tableEnv.sqlQuery("" +
"SELECT window_end, song_id, play_count FROM ( " +
" SELECT *, " +
" ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY play_count DESC) AS row_num " +
" FROM (" +
" SELECT window_start, window_end, song_id, COUNT(*) AS play_count " +
" FROM TABLE( " +
" TUMBLE(TABLE PlayEvents, DESCRIPTOR(event_time), INTERVAL '60' SECONDS)) " +
" GROUP BY window_start, window_end, song_id " +
" ) " +
") WHERE row_num <= 4 "
).execute().print();
第一个打印输出在开始后显示一致的结果,每个窗口期恰好有 4 个结果:
...
| +I | 2021-11-04 12:23:00.000 | 3 | 16 |
| +I | 2021-11-04 12:23:00.000 | 6 | 14 |
| +I | 2021-11-04 12:23:00.000 | 1 | 12 |
| +I | 2021-11-04 12:23:00.000 | 11 | 10 |
| +I | 2021-11-04 12:24:00.000 | 9 | 16 |
| +I | 2021-11-04 12:24:00.000 | 6 | 13 |
| +I | 2021-11-04 12:24:00.000 | 7 | 12 |
| +I | 2021-11-04 12:24:00.000 | 5 | 12 |
后续输出虽然显示了部分窗口内容:
...
| +I | 2021-11-04 12:25:00.000 | 9 | 12 |
| +I | 2021-11-04 12:25:00.000 | 6 | 6 |
| +I | 2021-11-04 12:27:00.000 | 11 | 18 |
...
例如该窗口每个区间仅包含 1、2、3 个元素,有时整个区间都会被删除。
如果我重新启动查询,所有结果将在第一次打印时正确显示(例如,每个窗口恰好 4 个元素..),然后它将继续部分响应。
我尝试了不同的配置,尝试将连续查询写入另一个 Kafka 主题,然后从那里查询。但不一致的部分结果仍然存在。
不确定我是否遗漏了一些重要配置,或者这是 Flink 的已知限制或问题?
附:我正在使用 Flink 1.14 在本地机器上运行我的测试进行测试。
【问题讨论】: