問題タブ [spotify-scio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
google-cloud-dataflow - Apache Beam ステートフル DoFn がすべての K/V ペアを定期的に出力
ステートフル DoFn ( @ProcessElement
with@StateId
ValueState
要素を使用) を使用して (Scio 経由で) Apache Beam のストリーミング データ ソースを (キーごとに) 集約しようとしています。これは、私が解決しようとしている問題に最も適していると思いました。要件は次のとおりです。
- 特定のキーについて、レコードは常に集計されます(基本的に合計されます)-以前に計算された集計は気にせず、最新のものだけです
- キーは、私が制御する特定の条件に基づいて状態 ( ) から削除される場合があります
state.clear()
- 新しいキーが検出されたかどうかに関係なく、5 分ごとに、状態から削除されていないすべてのキーを出力する必要があります。
これがストリーミング パイプラインであり、無期限に実行されることを考えると、起動されcombinePerKey
たペインを蓄積するグローバル ウィンドウで使用すると、メモリ フットプリントと実行に必要なデータ量が時間の経過とともに増加し続けるように思われるので、それを避けるために。さらに、これをテストすると (おそらく予想どおり)、各キーの最新の値を使用するのではなく、新しく計算された集計が履歴入力と共に出力に追加されます。
私の考えでは、StatefulDoFn を使用すると、now() までのすべてのグローバル状態を単純に出力できるようになりますが、これは簡単な解決策ではないようです。タイマーを使用してこのための人為的にコールバックを実行すること、およびゆっくりと成長する副入力マップ ( PCollectionView<Map<String,String>> を作成するときに重複する値の例外を解決する方法) を潜在的に使用し、何らかの形でこれをフラッシュすることについてのヒントを見てきました。 、しかし、これは基本的に、マップに結合するのではなく、マップ内のすべての値を反復処理する必要があります.
これを機能させるために簡単なことを見落としているような気がします。私は Beam のウィンドウ処理とタイマーの多くの概念に比較的慣れていないため、これを解決する方法についてアドバイスを求めています。ありがとう!