2017-05-24 5 views
1

レコードが順番に到着するストリームがあります。私はマップ関数を適用し、それにkeyBy関数を適用します。レコードの順序は、同じキーを持つレコードの各ストリーム内で維持されますか?Flinkのキー付きストリームのレコードの順序

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のサブタスク[2]など)内でのみ保持されます。この例では、各キー内の順序は保持されますが、並列性は、異なるキーの集計結果がシンクに到着する順序に関する非決定論を導入します。

上記の例では、keyByのsubtask [2]はmapのsubtask [1]とsubtask [2]の両方から要素を受け取ります。サブタスク間でのみ順序が維持される場合、各キー内の順序はどのように保持されますか?

答えて

1

keyBy操作では、同じサブタスクからのイベントの順序が保持されます。異なるサブタスクから来るイベントの場合、Flinkはあなたに何らかの注文保証を提供しません。次の2つのマップのサブタスクmap1map2と2シンクサブタスク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)の前に到着しているかどうかわからない。

関連する問題