Apache flink Apache Flink翻滚窗口延迟结果

Apache flink Apache Flink翻滚窗口延迟结果,apache-flink,Apache Flink,使用翻滚窗口的apache flink应用程序遇到问题。窗口大小是10秒,我希望每隔10秒有一个resultSet数据流。但是,当最新窗口的结果集总是延迟时,除非我将进一步的数据推送到源流 例如,如果我在“01:33:40.0”和“01:34:00.0”之间将多条记录推送到源流,然后停止查看日志,则不会发生任何事情 我在“01:37:XX”上再次推送一些数据,然后将在“01:33:40.0”和“01:34:00.0”之间获得窗口的结果集,这是不期望的,因为下游接收器逻辑期望及时得到结果集 如有任

使用翻滚窗口的apache flink应用程序遇到问题。窗口大小是10秒,我希望每隔10秒有一个resultSet数据流。但是,当最新窗口的结果集总是延迟时,除非我将进一步的数据推送到源流

例如,如果我在“01:33:40.0”和“01:34:00.0”之间将多条记录推送到源流,然后停止查看日志,则不会发生任何事情

我在“01:37:XX”上再次推送一些数据,然后将在“01:33:40.0”和“01:34:00.0”之间获得窗口的结果集,这是不期望的,因为下游接收器逻辑期望及时得到结果集

如有任何改进建议,我们将不胜感激。谢谢

以下是日志:

"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));
Table resultable=tableEnv.sqlQuery(“”)+
“选择”+
铸造(N02_001为VARCHAR(10))为铁路级+
计数(*)铁路等级计数+
翻滚开始(划行时间,间隔'20'秒)作为窗口开始+
翻滚结束(行时,间隔'20'秒)作为窗口结束+
“来自输入”+
“按翻滚分组(行时,间隔'20'秒),强制转换(N02_001为VARCHAR(10))”;
TupleTypeInfo tupleType=新的TupleTypeInfo(
类型。字符串,
类型。长,
Types.SQL\u时间戳,
类型。SQL_时间戳);
DataStream resultSet=tableEnv.toAppendStream(可结果,元组类型);
结果集
.map((Tuple4值)->{
字符串输出=“类:”+value.f0+“CNT:“+value.f1+”从:“+value.f2+”到:“+value.f3+”\n”;
log.warn(“结果集输出:“+output”);
返回值;
})
.returns(Types.TUPLE(Types.STRING、Types.LONG、Types.SQL_TIMESTAMP、Types.SQL_TIMESTAMP));

这是预期的行为,您使用的是
EventTime
,这意味着用于关闭窗口和跟踪应用程序中时间流的水印来自事件时间戳。这意味着,如果没有事件,将不会有时间流,因此现在将生成窗口。这就是你所观察到的

您所经历的行为很可能是因为您正在使用带有标点水印的
赋值器,它会为每个事件生成时间戳和水印。如果切换到
AssignerWithPeriodicWatermark
,即使不存在数据,也应生成水印,并关闭并发出窗口