Google Cloud Dataflow とは
Google Cloud の Dataflow(Apache Beam ベース) は、バッチ・ストリームの両方に対応したデータ処理基盤です。
特に Pub/Subとの連携によるリアルタイムETL(Extract, Transform, Load) は、データレイク/ウェアハウス構築の典型的なパターンです。
想定ユースケース
(1) IoTやWebアプリから送られてくるリアルタイムJSONデータ
(2) これを Pub/Sub経由で受信
(3) Dataflowで:
-
JSONをパース
-
重複除去
-
バリデーション(空白チェックなど)
-
フィルタ済みデータのみ BigQuery に書き込み
パイプラインのパフォーマンスを向上させる方法
-
パイプライン実行オプションで、ワーカーの最大数 (maxNumWorkers) を増加させる(スケールアウト)
-
パイプライン実行オプションで、ワーカーのマシンタイプをより大きなものに変更する(スケールアップ)
チェックポイント/スナップショット
Dataflowはストリーミング処理においてチェックポイント/スナップショットを活用し、ジョブ再開時に中断時点から処理を継続可能。
Cloud Scheduler
Cloud Scheduler は cron 形式で Dataflow ジョブのバッチ実行を自動化できます。
App Engine の Cron Service を使って定時実行することも可能ですが、Cloud Schedulerの方が推奨されます。
ウィンドウ処理
Dataflow のストリーミング パイプラインでは、無限に続くデータの流れを一定の塊(ウィンドウ)に分けて処理します。
Dataflow では event time ベースの処理を行うため、ウィンドウ処理をするには各データに対して timestamp(イベント発生時刻) を明示する必要があります。
Google Cloud Dataflowでは、unbounded(終わりのない)データセットに対して明示的にウィンドウを指定しない場合、デフォルトで「Global Window」が適用されます。
Global Windowとは:
-
全てのデータを1つの論理的なウィンドウとして扱う
-
明示的なウィンドウ指定(例:Fixed Window、Sliding Window)がないと集計や出力が遅延または実行されない可能性がある
データの一時的保存
ストリーミングパイプライン間でデータを受け渡すには Pub/Sub が最適。
処理の途中でデータを一時的に保存し、別のパイプラインや後続処理で再利用する場合もPub/Subを使います。
パイプラインを終了する方法
モード | 説明 |
---|---|
Cancel | 即時終了。インフライト中のデータは失われる可能性あり。 |
Drain | インフライト中のデータをすべて処理してから安全に終了する。 |
Watermarks(ウォーターマーク)
「これより前のイベントはもう来ないだろう」という進行中の時間の目印。遅れてくるデータの扱いを制御するカギ。
Fusion Optimization(フュージョン最適化)
Apache Beam / Google Cloud Dataflow における 内部のパイプライン最適化処理であり、連続する処理を自動的に1つのステージにまとめることで、不要なシャッフルやI/Oを減らし、処理速度とコストを最適化しようとする機能です。
Dataflow の Fusion Optimization を抑制して処理の爆発を回避したいときは、GroupByKeyを挿入するのが公式なテクニックです。
モジュール化と依存性注入
Dataflowパイプラインの一部を差し替えてテストするには、処理をモジュール化し、依存性注入(Dependency Injection) を使うのが有効です。
これにより、テスト時に実際の処理をモックやスタブに置き換えることができます。
入力データのエラー対策
データを変換するDoFnにtry-catchブロックを追加し、sideOutputを使用して後でPub/Subに保存できるPCollectionを作成します。