流中记录的排序

Ordering of Records in Stream

以下是我的一些疑问:

我有两个不同的流 stream1stream2,其中的元素是有序的。

1) 现在,当我对每个流执行 keyBy 时,顺序会保持不变吗? (因为这里的每个组只会发送给一个任务经理) 我的理解是,记录将按组顺序排列,请在此处纠正我。

2) 在两个流上的 keyBy 之后,我正在进行联合分组以获取匹配和不匹配的记录。订单也会在这里维持吗?,因为这也适用于 KeyedStream。 我正在使用 EventTimeAscendingTimestampExtractor 生成 timestampwatermark

3) 现在我想使用 map/flatmap 对从 2)​​ 得到的 matching_nonMatchingStream 执行序列检查。 我需要在这里再次执行 keyBy 吗? 我在这里的理解是链条将在这里工作,纠正我,变得困惑。

4) slotSharingGroup - 你能详细描述一下吗 根据文档:设置此操作的插槽共享组。如果可能,同一插槽共享组中的并行操作实例将共同位于同一 TaskManager 插槽中。

1) 是也不是。 Flink 使用所谓的 Watermarks to track the ordering. This ensures that records can be assigned to the correct windows and windows are not closed until all data is available. However, a strict order is not guaranteed per group (because of parallel incoming data)。团与团之间,完全没有顺序保证。

2) 与 (1) 的答案基本相同。

3) 您不需要再次使用keyBy。默认情况下 map/flatMap 将被链接。

4) 见 https://ci.apache.org/projects/flink/flink-docs-release-1.0/internals/general_arch.html#the-processes

关于订购保证

此页面提供了很好的概述和解释,以及订购保证:https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/concepts.html#parallel-dataflows

要点是:

在每个并行流分区中保持顺序。有关流分区的解释,请参见此处:https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/concepts.html#parallel-dataflows

对于像 "keyBy()" 或 "rebalance()" 这样改变分区的操作,每对源和目标流分区维护顺序,即每对发送和接收运算符。

正如 Matthias 提到的,如果一个组(由一个键定义,运行 在一个接收目标运营商上)从多个发送者那里获取元素,则没有明确定义的元素的严格排序。使用事件时间等概念,您可以根据数据(附加的时间戳)强加有意义的顺序。