【问题标题】:Ordering of records in a keyed stream in FlinkFlink中键控流中的记录排序
【发布时间】:2017-05-24 20:19:08
【问题描述】:

我有一个记录按顺序到达的流。我应用了 map 函数,然后对其应用了 keyBy 函数。记录的顺序是否会在具有相同键的每个记录流中保持?

Ordering of Records in Stream 中也有类似的问题。但我对那里给出的答案和从链接“https://ci.apache.org/projects/flink/flink-docs-release-1.2/concepts/programming-model.html”复制的以下描述感到困惑。

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

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

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

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

    为了说明这一点,假设以下场景:您有两个 map 子任务 map1map2 和两个 sink 子任务 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) 之前到达。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      相关资源
      最近更新 更多