使用滚动窗口遇到了apache flink应用程序的问题。窗口大小为10秒,我希望每10秒就有一次resultSet DataStream。但是,除非我将更多数据推送到源流,否则最新窗口的resultSet总是被延迟。
例如,如果我将多个记录推送到“ 01:33:40.0”和“ 01:34:00.0”之间的源流中,然后停下来观看日志,则不会发生任何事情。
我再次在'01:37:XX'上推送一些数据,然后将获得'01:33:40.0'和'01:34:00.0'之间的窗口的resultSet,这是不期望的,因为下游接收器逻辑希望准时按一下resultSet。
任何改进的提示将不胜感激。谢谢。
下面是日志:
"log timestamp": "2019-11-15 01:37:45",
"message": "resultSet output: CLASS: 13 CNT: 1 from: 2019-11-15 01:33:40.0 to: 2019-11-15 01:34:00.0\n",
下面是代码段:
Table resultTable = tableEnv.sqlQuery(""+
"SELECT " +
" CAST (N02_001 AS VARCHAR(10)) AS RAILWAY_CLASS, " +
" COUNT(*) RAILWAY_CLASS_COUNT, " +
" TUMBLE_START(rowtime, INTERVAL '20' SECOND) as WINDOW_START, " +
" TUMBLE_END(rowtime, INTERVAL '20' SECOND) as WINDOW_END " +
" FROM Inputs " +
" GROUP BY TUMBLE(rowtime, INTERVAL '20' SECOND), CAST (N02_001 AS VARCHAR(10))");
TupleTypeInfo<Tuple4<String, Long, Timestamp, Timestamp>> tupleType = new TupleTypeInfo<>(
Types.STRING,
Types.LONG,
Types.SQL_TIMESTAMP,
Types.SQL_TIMESTAMP);
DataStream<Tuple4<String, Long, Timestamp, Timestamp>> resultSet = tableEnv.toAppendStream(resultTable, tupleType);
resultSet
.map((Tuple4<String, Long, Timestamp, Timestamp> value) -> {
String output = "CLASS: " + value.f0 + " CNT: " + value.f1 + " from: " + value.f2 + " to: " + value.f3 + "\n";
log.warn("resultSet output: " + output);
return value;
})
.returns(Types.TUPLE(Types.STRING, Types.LONG, Types.SQL_TIMESTAMP, Types.SQL_TIMESTAMP));
答案 0 :(得分:1)
这是预期的行为,您正在使用EventTime
,这意味着用于关闭窗口并跟踪应用程序中时间流的水印来自事件时间戳。这意味着如果没有事件,将不会有时间流,因此现在将生成窗口。这就是您正在观察的。
您遇到的行为很可能是由于您正在使用AssignerWithPunctuatedWatermark
这一事实,它会为每个事件发出时间戳和水印。如果您切换到AssignerWithPeriodicWatermark
,则即使不存在任何数据也应生成水印,然后关闭并释放该窗口。