Flink を使用してフロー データ統計を完了する | JD Cloud テクニカル チーム

1. 統計処理



すべてのストリーム計算統計のプロセスは次のとおりです。

1. データソースにアクセスする

2. 複数のデータ変換操作 (フィルタリング、分割、集計計算など) を実行します。

3. 計算結果の保存 データソースは複数であってもよく、データ変換ノードがデータを処理した後、データを 1 つ以上の次のノードに送信してデータの処理を続行できます。

Flink プログラム構築の基本単位はストリームと変換です (DataSet は本質的にストリームです)。ストリームは中間結果データです。変換はデータを処理および操作します。この操作は 1 つ以上のストリームを入力として受け取り、結果として 1 つ以上のストリームを計算して出力し、最後にデータを保存するためにシンクされます。



データ ソースを含め、出力された各データ結果は、DataStream を通じて次のレベルに渡され、処理が継続されます。

各変換には 2 つのステップがあります。

1. プロセスデータ

2. 加工したデータを出力する

2. Flinkのデータソース

Flink は、データ ソースを提供するために SourceFunction インターフェイスを実装するだけで済みます。SourceFunction には抽象実装クラス RichParallelSourceFunction があり、この実装クラスを継承し、Source をカスタマイズするために使用できる 3 つのメソッドを実装します。 public void open(Configurationparameters) //初期化中に呼び出され、一部のパラメータを初期化できます public void run(SourceContext< T> ctx)/ /Send data. このメソッドでは、ctx のcollect メソッドを呼び出してデータを送信します。



この例では、Order タイプのエンティティが 20 秒ごとに送信されます。

3. Flinkのデータ変換操作

Flink は、さまざまなシナリオに応じてさまざまなソリューションを提供し、処理プロセスにおける効率の問題に対するユーザーの注意を軽減します。

「マップ」はマッピングを行うことです。たとえば、2 つの文字列を 1 つの文字列にマージしたり、1 つの文字列を 2 つまたは 3 つの文字列に分割したりします。

「 flatMap 」は、文字列を文字配列に分割するなど、レコードを 2 つ、3 つ、または 4 つのレコードに分割することに似ています。

「フィルター」はフィルタリングと似ています。

「keyBy」は SQL の group by に相当します。

「aggregate」は、カウント、合計、平均などの集計操作です。

「reduce」はMapReduceのreduceと似ています。

「結合」操作は、データベースの結合に似ています。

「connect」は、2 つのストリームを 1 つのストリームに接続することを実装します。

"repartition" は再パーティション化操作です (まだ勉強していません)。

「プロジェクト」操作は SQL のスナックに似ています (まだ勉強していません)。

一般的な操作には、フィルター、マップ、フラットマップ、keyBy (グループ化)、および集計 (集計) が含まれます。具体的な使用法は、以下の例に反映されます。

3. ウィンドウ

ストリームデータの計算では、連続データを一定のルールに従って多数のフラグメントに分割し、フラグメント内で統計や計算を実行できます。たとえば、1 時間以内にデータを小さなデータベース テーブルに保存し、データのこの部分に対して計算と統計を実行できますが、ストリーム コンピューティングはリアルタイムでのみ実行されます。

一般的なウィンドウは次のとおりです。

1. 時間単位の時間枠 (例: 毎秒、毎時など)。

2. データ数に基づいてウィンドウをカウントします (例: 100 要素ごと)

Flink は、いくつかの一般的なタイム ウィンドウ モデルを提供します。

1. タンブリング ウィンドウ (重なり合わない)

データ ストリーム内の各データは 1 つのウィンドウにのみ属します。それぞれのウィンドウは固定サイズであり、ウィンドウは互いに重なりません。サイズ 5 分のタンブリング ウィンドウを指定すると、次の図に示すように、ウィンドウが 5 分ごとに起動されます。



2. スライディングウィンドウ(オーバーラップ)

タンブリング ウィンドウとは異なり、スライディング ウィンドウを作成する場合は、ウィンドウ サイズを指定するだけでなく、ウィンドウの開始位置を決定するウィンドウ スライディング パラメーター (ウィンドウ スライド パラメーター) も指定する必要があります。したがって、ウィンドウ スライディング パラメータがウィンドウ サイズより小さい場合、ウィンドウ間に重複領域が表示される可能性があります。たとえば、次の図に示すように、ウィンドウ サイズを 10 分、スライディング パラメーターを 5 分に指定すると、次のようになります。



3. セッションウィンドウ

一定期間データ ストリームにデータがない場合、セッション ウィンドウは閉じられます。したがって、セッション ウィンドウには固定サイズがなく、セッション ウィンドウの開始位置を計算できません。



4. Flink における時間の概念

Flink には 3 つの異なる時間概念があります

1. 処理時間 処理時間は、上記の変換操作を実行したときのシステム時間を指します。
2.イベント時間 イベント時間とは、ビジネスが発生した時間を指します。各ビジネス レコードにはタイムスタンプが付けられます。データ内のどの属性を取得するかを指定する必要があります。ビジネスの発生時刻に基づいてデータをカウントする場合、受け取ったデータの時刻が狂っている場合、いつ集計計算をトリガーすればよいのか、いつまでも待っているわけにはいきません。Flink はウォーターマークの概念を導入しました。このウォーターマークはウィンドウに追加され、最長の待ち時間をウィンドウに伝えます。この時間を超えたデータは破棄され、処理されなくなります。
3. 取り込み時間とは、データが Flink に入るときのシステム時間を指します。
 

5. 注文統計の例

 ステップ 4: タイムスタンプとウォーターマークを設定する

 DataStream<Order> marksSource = vilidatedSource
.assignTimestampsAndWatermarks(
new BoundedOutOfOrdernessTimestampExtractor<Order>(Time.minutes(1)){
            @Override
            public long extractTimestamp(Order o) {
                return o.getTimestamp().getTime();
            }
        });

データを処理するために EventTime を使用するように既に設定しているため、タイム ウィンドウを計算する前に、データにタイムスタンプを取得するためのフィールドを割り当てる必要があります。ここでは、Order のタイムスタンプ フィールドを EventTime に設定し、1 分も設定しますウォーターマークは、最大 1 分間待機することを意味します。システム時間から 1 分を超えて発生したデータはカウントされません。

ステップ 5: データのグループ化

KeyedStream<Order, Tuple> keyedStream =
                marksSource.keyBy("biz");//先以biz来Group

ここでは、Order のビジネス フィールドがグループ化されるように設定されています。これは、同じビジネスのすべてのデータが計算のために同じ時間枠に入るということを意味します。

ステップ 6: 時間枠と集計計算を指定する

DataStream<List<Tuple2<String, String>>> results = keyedStream
                .window(TumblingEventTimeWindows.of(Time.minutes(1)))
                .aggregate(new OrderSumAggregator()).setParallelism(1);

ここでは、重複しない TumbleEventTimeWindow が 1 分単位で設定されています。次に、OrderSumAggregator を使用して集計計算を実行します。なお、最初の設定でProcessTimeを使用してデータを処理する場合、ここのウィンドウはTumbleProcessTimeWinwowとなり、表と裏が1対1に対応している必要があります。以前は表と裏が対応していなかったため、統計結果は間違っており、理由が見つかりませんでした。

6. 集計計算

上記の例のコア部分は集計計算であり、これが OrderSumAggregator です。集計計算については、Flink が提供する AggregateFunction インターフェイスを実装し、そのメソッドを書き直すだけで済みます。

ACC createAccumulator();//後続の操作のためのデータ統計コンテナを作成します。

ACC add(IN in, ACC acc);//各要素がウィンドウに追加されるときに呼び出されます。最初のパラメータはウィンドウに追加される要素で、2 番目のパラメータは統計のコンテナ (上で作成したもの) です。

OUT getResult(ACC acc); // ウィンドウ統計イベントがトリガーされて統計結果を返すときに呼び出されます。

ACC merge(ACC acc1, ACC acc2);//ウィンドウがマージされる場合にのみ呼び出され、2 つのコンテナをマージします

状況に応じて、このコンテナはメモリまたは他のストレージ デバイスに提供することもできます。

上記の例では、営業時間に応じて 1 分あたりの注文数をカウントでき、注文は最大 1 分の遅延でレポートされます。ただし、1 分以内に報告されるデータを待つため、データは 1 分遅れてカウントされます。たとえば、8:02 では、8:00 から 8:01 までに報告されたデータしかカウントできません。この問題を解決するには、ウィンドウにカスタム統計トリガーを追加します。このトリガーは、8:00 から 8:01 に到達するように、正時に統計イベントをトリガーできます (つまり、上記の getResults メソッドを呼び出します)。この期間のデータは、8:01 に 1 回カウントされ、8:02 に再度カウントされます (さらに、次の 1 分間に報告されるデータもカウントされます)。

著者: JD Technology Liang Fawen

出典:JD Cloud Developer Community 転載の際は出典を明記してください

IntelliJ IDEA 2023.3 と JetBrains Family Bucket の年次メジャー バージョン アップデート 新しいコンセプト「防御型プログラミング」: 安定した仕事に就く GitHub.com では 1,200 を超える MySQL ホストが稼働していますが、8.0 にシームレスにアップグレードするにはどうすればよいですか? Stephen Chow の Web3 チームは来月、独立したアプリをリリースする予定ですが、 Firefox は廃止されるのでしょうか? Visual Studio Code 1.85 リリース、フローティング ウィンドウ Yu Chengdong: ファーウェイは来年破壊的な製品を発売し、業界の歴史を書き換えるだろう 米国 CISA はメモリ セキュリティの脆弱性を排除するために C/C++ の廃止を勧告 TIOBE 12 月: C# がプログラミングになると予想30年前 雷軍が書いた論文「コンピュータウイルス判定エキスパートシステムの原理と設計」
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10320419