Flink 批处理模式不按事件时间戳排序

Flink batch mode does not sort by event timestamp

我有一个自定义的 flink Source,我有一个 SerializableTimestampAssigner 将事件时间戳分配给源发出的记录。由于底层数据存储的性质,源可能会乱序发出记录,但是使用 BATCH 模式,我希望 Flink 在任何操作员处理它们之前按事件时间戳对这些记录进行排序。

摘自Flink document关于执行模式:

In BATCH mode, where the input dataset is known in advance, there is no need for such a heuristic as, at the very least, elements can be sorted by timestamp so that they are processed in temporal order.

然而,情况似乎并非如此。如果我使用我的时间戳分配器从 Source (StreamExecutionEnvironment.fromSource) 创建一个数据流,然后 datastream.addSink(x => println(extractTimestamp(x)),输出不是严格升序的。我对文档的理解有误吗?还是 flink 期望我(用户)自己对输入数据集进行排序?

BATCH执行模式先key排序,在每个key内,按timestamp排序。通过这种方式操作,它一次只需要保持一个键的状态,因此这使得运行时简单高效。

如果您的管道不使用键控流,那么您将不会使用键控状态或计时器,因此顺序无关紧要(我不确定会发生什么)。

对于键控 co-streams,它们都以相同的方式进行键控,并且两个流都按这些键排序并且键步进。

广播流先完整发送。