記事ディレクトリ
1.ウィンドウの概要
ストリーミングストリーミングコンピューティングは、無限のデータセットを処理するように設計されたデータ処理エンジンであり、無限のデータセットは、成長する本質的に無限のデータセットを指し、ウィンドウは、無限のデータを有限のブロックに分割する方法です。処理の手段。
Windowは、無限データストリーム処理の中核です。Windowは、無限ストリームを有限サイズの「バケット」バケットに分割します。これらのバケットに対して計算操作を実行できます。
2.ウィンドウタイプ
ウィンドウは2つのカテゴリに分けることができます。
- CountWindow:時間に関係なく、指定されたデータ数に従ってウィンドウを生成します。
- TimeWindow:時間に従ってウィンドウを生成します。
TimeWindowの場合、ウィンドウ実装の原則に従って、タンブリングウィンドウ、スライディングウィンドウ、セッションウィンドウの3つのカテゴリに分類できます。
2.1ウィンドウのタンブリング
データは、固定ウィンドウ長に従ってスライスされます。
特徴:時間調整、固定ウィンドウ長、オーバーラップなし。
ローリングウィンドウアロケータは、指定されたウィンドウサイズのウィンドウに各要素を割り当てます。ローリングウィンドウのサイズは固定されており、オーバーラップしません。例:5分間のローリングウィンドウを指定すると、次の図に示すようにウィンドウが作成されます。
2.2スライディングウィンドウ
スライドウィンドウは、固定ウィンドウのより一般化された形式です。スライドウィンドウは、固定ウィンドウの長さとスライド間隔で構成されます。
機能:時間調整、固定ウィンドウ長、およびオーバーラップ。
スライディングウィンドウアロケータは、要素を固定長ウィンドウに割り当てます。ローリングウィンドウと同様に、ウィンドウのサイズはウィンドウサイズパラメータによって構成され、別のウィンドウスライディングパラメータはスライディングウィンドウが開始する頻度を制御します。したがって、スライディングウィンドウのスライディングパラメータがウィンドウサイズよりも小さい場合、ウィンドウがオーバーラップする可能性があります。その場合、要素は複数のウィンドウに割り当てられます。
たとえば、10分のウィンドウと5分のスライドウィンドウがある場合、次の図に示すように、各ウィンドウの5分のウィンドウには過去10分間に生成されたデータが含まれます。
2.3セッションウィンドウ
これは、Webアプリケーションセッションと同様に、指定された時間のタイムアウト間隔と組み合わされた一連のイベントで構成されます。つまり、一定期間新しいデータが受信されない場合、新しいウィンドウが生成されます。
特徴:時間が調整されていません。
セッションウィンドウアロケータは、セッションアクティビティを通じて要素をグループ化します。ローリングウィンドウやスライディングウィンドウと比較して、セッションウィンドウには、重複した固定の開始時間と終了時間がありません。要素が受信されなくなった場合、つまり非アクティブな間隔が生成された場合、ウィンドウは閉じられます。セッションウィンドウは、セッション間隔で構成されます。このセッション間隔は、非アクティブ期間の長さを定義します。この非アクティブ期間が発生すると、現在のセッションが閉じられ、後続の要素が新しいセッションウィンドウに割り当てられます。
3.1タイムウィンドウ
TimeWindowは、指定された時間範囲のすべてのデータをウィンドウに構成し、ウィンドウ内のすべてのデータを一度に計算します。
3.1.1ローリングウィンドウ
Flinkのデフォルトの時間ウィンドウはProcessingTimeに従ってウィンドウに分割され、Flinkによって取得されたデータはFlinkに入る時間に従って異なるウィンドウに分割されます。
val minTemperature: DataStream[(String, Double)] = stream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.timeWindow(Time.seconds(15))
.reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))
時間間隔は、Time.milliseconds(x)、Time.seconds(x)、Time.minutes(x)などのいずれかで指定できます。
3.1.2スライディングウィンドウ(SlidingEventTimeWindows)
スライディングウィンドウとローリングウィンドウの関数名はまったく同じですが、パラメーターを渡すときに2つのパラメーターを渡す必要があります。1つはwindow_sizeで、もう1つはsliding_sizeです。
以下のコードのsliding_sizeは5秒に設定されています。つまり、ウィンドウは5秒ごとに計算され、各計算のウィンドウ範囲は15秒以内のすべての要素です。
val minTemperature: DataStream[(String, Double)] = stream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.timeWindow(Time.seconds(15), Time.seconds(5))
.reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))
時間間隔は、Time.milliseconds(x)、Time.seconds(x)、Time.minutes(x)などのいずれかで指定できます。
3.2カウントウィンドウ
CountWindowは、ウィンドウ内の同じキーを持つ要素の数に従って実行をトリガーし、実行中に要素の数がウィンドウサイズに達したキーに対応する結果のみを計算します。
注:CountWindowのwindow_sizeは、すべての入力要素の総数ではなく、同じキーを持つ要素の数を参照します。
3.2.1ローリングウィンドウ
デフォルトのCountWindowはローリングウィンドウです。ウィンドウサイズを指定するだけで済みます。要素の数がウィンドウサイズに達すると、ウィンドウの実行がトリガーされます。
val minTemperature: DataStream[(String, Double)] = stream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.countWindow(5)
.reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))
3.2.2スライディングウィンドウ
スライディングウィンドウとローリングウィンドウの関数名はまったく同じですが、パラメーターを渡すときに2つのパラメーターを渡す必要があります。1つはwindow_sizeで、もう1つはsliding_sizeです。
次のコードのsliding_sizeは2に設定されています。つまり、同じキーを持つ2つのデータが受信されるたびに計算され、各計算のウィンドウ範囲は10要素です。
val sumStream: DataStream[(String, Double)] = stream
.map(r => (r.id, r.temperature))
.keyBy(0)
// 当一个 key 的个数达到 2 个的时候触发计算,计算该 key 最近 10 个元素的内容
.countWindow(10,2)
.sum(1)
3.3ウィンドウ関数
ウィンドウ関数は、ウィンドウに収集されたデータに対して実行される計算操作を定義します。これは、次の2つのカテゴリに分類できます。
-
インクリメンタルアグリゲーション機能(インクリメンタルアグリゲーション機能)
単純な状態を維持しながら、到着時にすべてのデータを計算します。典型的なインクリメンタル集計関数は、ReduceFunction、AggregateFunctionです。
-
フルウィンドウ機能
最初にウィンドウ内のすべてのデータを収集し、計算時にすべてのデータをトラバースします。
ProcessWindowFunctionはフルウィンドウ関数です。
3.4その他のオプションのAPI
-
.trigger()
-トリガーは、ウィンドウが閉じられるタイミングを定義し、計算をトリガーして結果を出力します -
.evitor()
-リムーバー。特定のデータを削除するロジックを定義します -
.allowedLateness()
-遅延データの処理を許可する -
.sideOutputLateData()
-遅延データをサイド出力ストリームに入れます -
.getSideOutput()
-サイド出力ストリームを取得します