Dataflow
1. プログラミングモデル
Dataflow は Apache Beam に準拠しており、バッチとストリーミングの両方のデータの並列処理パイプラインを定義するオープンソースの統合モデル。
以下のような構成要素からなる。
- パイプライン
- 入力データの読み取り、そのデータの変換、出力データの書き込みに関連する、一連の計算全体をカプセル化したもの
- Apache Beam プログラムでは、まず、Pipeline オブジェクトを構築し、そのオブジェクトを基礎として使用してパイプラインのデータセットを作成する
- PCollection
- パイプライン データとして機能する複数要素のデータセット
- Apache Beam 変換では、PCollection オブジェクトをパイプラインの各ステップの入力と出力として使用する
- 変換
- データを変換する処理オペレーション
- 1 つ以上の PCollection を入力として受け取り、そのコレクションの各要素に対して指定したオペレーションを実行して、1 つ以上の PCollection を出力
- ParDo
- Apache Beam SDK のコア並列処理オペレーション
- 入力 PCollection の 各要素 に対してユーザー指定の関数を呼び出し、0 個以上の出力要素を 1 つの出力 PCollection に収集
- これはなんらかの変換や演算処理を提供するオペレーションではないことに注意
- パイプライン I/O コネクタ
- パイプラインにデータを読み込み、パイプラインから出力データの書き出しをサポート
- ソースとシンクで構成されている
- Apache Beam のすべてのソースとシンクの変換によって、さまざまなデータ ストレージ形式のデータをパイプラインが扱えるようになる
- 集計
- 複数の入力要素からなんらかの値を計算するプロセス
- ユーザー定義関数(UDF)
- Apache Beam 内の一部のオペレーションでは、変換を構成する方法としてユーザー定義コードを実行でる
- ParDo では、ユーザー定義コードはすべての要素に適用するオペレーションを指定し、Combine では、値の結合方法を指定する
- パイプラインには、ランナーの言語とは異なる言語で書かれた UDF が含まれている場合、複数の言語で書かれた UDF が含まれている場合もある
- ランナー
- パイプラインを受け入れて実行するソフトウェア
- ほとんどのランナーは、超並列ビッグデータ処理システムへの変換装置またはアダプタ
- ローカルのテストとデバッグのための他のランナーも存在する
また、 ストリーミングパイプライン においては以下のような概念がある。
- ウィンドウ
- 入力となるコレクションをタイムスタンプに応じて処理の単位として分割する幅
- タンブリング ウィンドウ(Apache Beam では固定ウィンドウ):データ ストリームを重なりなく分ける一定の時間間隔。
- ホッピング ウィンドウ(Apache Beam ではスライディング ウィンドウ):データ ストリーム内の一定の時間間隔。タンブリング ウインドウは重ならないが、ホッピング ウインドウは重なることがある
- セッション ウィンドウ:連続しないデータ間のギャップがある場合に、そこを切れ目とするウィンドウ。ユーザ行動に起因するものなど。
- 入力となるコレクションをタイムスタンプに応じて処理の単位として分割する幅
- ウォーターマーク
- ウィンドウにつけるタイムスタンプを基にした目印
- データの遅延などを見つける
- トリガー
- データが到着したときに集計結果をいつ出力するかを決定する
- デフォルトでは、ウォーターマークを基に決定される
2. データ共有
Dataflow には、パイプライン間でデータを共有する仕組みは無い。
Cloud Storage や AppEngineのインメモリキャッシュなどを利用することになる。
3. 停止
Dataflow 停止 する場合は次のオプションがある。
- キャンセル
- ストリーミング処理中であっても直ちに Dataflow が停止する
- 処理中のデータが失われる可能性がある
- ドレイン
- 仕掛かり中のストリーミング処理を全て完了してから停止する
- 処理中のデータは失われない
- ただし、バッチ処理ではこのオプションは機能しない