Flink 键控流中记录的排序

Ordering of records in a keyed stream in Flink

我有一个记录按顺序到达的流。我应用了一个 map 函数,然后在其上应用了 keyBy 函数。记录的顺序是否会在每个记录流中使用相同的键来维护?

. But I am confused between the answer given there and the below description copied from the link "https://ci.apache.org/projects/flink/flink-docs-release-1.2/concepts/programming-model.html 中也有类似的问题。

" 在重新分配交换中,元素之间的顺序仅保留在每对发送和接收子任务中(例如,map() 的子任务 [1] 和 keyBy/window 的子任务 [2]) . 所以在这个例子中,保留了每个键内的顺序,但是并行性确实引入了关于不同键的聚合结果到达接收器的顺序的不确定性。“

在给出的示例中,keyBy 的子任务[2] 从 map 的子任务[1] 和子任务[2] 中接收元素。如果仅在子任务之间维护排序,如何保留每个键中的排序?

keyBy 操作仅维护来自同一子任务的事件的顺序。对于来自不同子任务的事件,Flink 不给你任何顺序保证。

为了说明这一点,假设以下场景:您有两个地图子任务 map1map2 以及两个接收器子任务 sink1sink2。在映射器和接收器之间有一个 keyBy 操作。

map1 产生以下事件序列 (1, A), (2, B), (1, C), (2, D) 并且 map2 产生 (1, U), (1, V), (2, W), (2, X) 其中第一个元组条目是我们的键。这意味着 sink1 将接收集合 {(1, A), (1, C), (1, U), (1, V)}sink2 将接收集合 {(2, B), (2, D), (2, W), (2, X)}.

不失一般性,我们来看一下sink1的顺序。您可以说的是,来自同一生产子任务的所有事件都按照与生产时相同的顺序到达。因此,(1, A) 将在 (1, C) 之前到达。但是,您不能说出来自不同生成子任务的事件之间的顺序。所以你不知道 (1, A) 是否在 (1, U) 之前到达。