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 つの異なる時間概念があります
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 分間に報告されるデータもカウントされます)。
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年前に 雷軍が書いた論文「コンピュータウイルス判定エキスパートシステムの原理と設計」著者: JD Technology Liang Fawen
出典:JD Cloud Developer Community 転載の際は出典を明記してください