ここでは、プログラミングモデルの周りに頭を抱えようとしています。シナリオ私はPub/Sub + Dataflowを使用してWebフォーラムのアナリティクスを計測しています。私は仕事がしたいGoogle Dataflowで長生きの状態
ID | TS | num_comments
1 | 1 | 0
1 | 2 | 1
2 | 2 | 0
1 | 4 | 2
:
ID | TS | EventType
1 | 1 | Create
1 | 2 | Comment
2 | 2 | Create
1 | 4 | Comment
そして、私がどのように見えるデータフローからの流れで終わるしたい:私は次のようになりパブ/サブから来るデータのストリームを持っていますこのロールアップはストリームプロセスとして実行され、新しいイベントが入ったときに新しいカウントが入力されます。私の質問は、ジョブが現在のトピックIDとコメントカウントの状態を保存するための慣用的な場所はどこですか?トピックは長年にわたって生きることができると仮定します。現在のアイデアは以下の通りです。
- は、私がこれを書いたとしても私はありませんBigTableのにとトピックIDの現在のコメント数がで来ているものをDoFnクエリ内のトピックIDは「現在」エントリを書きますファン。
- 何らかの方法でサイド入力を使用しますか?これは答えかもしれないようですが、もしそうなら私は完全に理解していません。
- ストリーミングジョブをグローバルウィンドウで設定します。トリガーはレコードを取得するたびにオフになり、データフローを使用してペインの履歴全体をどこかに保持します。 (無制限のストレージ要件ですか?)
EDIT:これらの3つの戦略、またはそれを実行する他のさまざまな方法のいずれかを実装するのに問題はありません。 最高の Dataflowでこれを行う方法。バックフィルの履歴を再処理する必要があるもの
EDIT2:データフローサービスにバグがあり、現在、フラットトランスフォームに入力を追加すると更新が失敗するというバグがありますフラット操作に何かを追加することを含むジョブを変更した場合、そのジョブで発生した状態を破棄して再構築する必要があります。
右のように、これは私の潜在的な実装のリストでは3番です。私の質問は、それはいい考えですか?ここの状態は、データフローによって暗黙的に維持されています。ジョブを再開する必要がある場合はどうなりますか?歴史的なバックフィルはどのように実装されますか? – bfabry
変更内容に応じて、[既存のパイプラインを更新する](https://cloud.google.com/dataflow/pipelines/updating-a-pipeline)することができます。変更がより重要な場合は、すべての古いデータを読み取ることができるカスタムソースを使用している場合は、前述のアプローチが有効です。 –
バックフィルなどを処理するためのカスタムソースは興味深いアイデアです。それはその問題を解決するようです。それは良い考えですか?それは永遠に成長するだけの状態ですか?フォーラムの話題が閉じられることができたら、「このIDのために私たちが心配しているイベントはもうなくなります」と言って、それが捨てられるようにする方法はありますか? – bfabry