Dataflow は、オープンソースの Apache Beam プロジェクトをベースにしています。このドキュメントでは、Apache Beam プログラミング モデルについて説明します。
概要
Apache Beam は、バッチ パイプラインとストリーミング パイプラインの両方を定義するオープンソースの統合モデルです。Apache Beam プログラミング モデルは、大規模なデータ処理の構造を単純化します。Apache Beam SDK の 1 つを使用して、パイプラインを定義するプログラムを構築します。次に、Dataflow などの特定のプラットフォームでパイプラインを実行します。このモデルのおかげで、並列処理のオーケストレーション管理ではなく、データ処理ジョブの論理的な構成に集中できます。
Apache Beam では、個々のワーカーの調整、データセットのシャーディング、その他のタスクなど、分散処理の下層レベルの詳細をユーザーが扱う必要はありません。Dataflow ではこれらの下層レベルの細かい設定が完全に管理されます。
パイプラインは、データ コレクションに適用される変換のグラフです。Apache Beam では、コレクションは PCollection
と呼ばれ、変換は PTransform
と呼ばれます。PCollection
は、制限ありまたは制限なしにすることができます。制限ありの PCollection
は既知の固定サイズで、バッチ パイプラインを使用して処理できます。制限なしの PCollections
では、受信したデータを処理するため、ストリーミング パイプラインを使用する必要があります。
Apache Beam には、Google Cloud サービスや Apache Kafka などのサードパーティ テクノロジーなど、さまざまなシステムとの間で読み書きを行うためのコネクタが用意されています。
次の図は、Apache Beam パイプラインを示しています。
任意のロジックを実行する PTransforms
を記述できます。Apache Beam SDK には、次のような処理を行う便利な PTransforms
のライブラリが用意されています。
- 述語を満たさないすべての要素を除外します。
- 各要素に 1 対 1 のマッピング関数を適用します。
- キーで要素をグループ化します。
- コレクション内の要素をカウントします。
- Key-Value コレクション内の各キーに関連付けられている要素をカウントします。
Dataflow を使用して Apache Beam パイプラインを実行するには、次の操作を行います。
- Apache Beam SDK を使用してパイプラインを定義し、ビルドします。また、Dataflow テンプレートを使用して、ビルド済みのパイプラインをデプロイすることもできます。
- Dataflow を使用してパイプラインを実行します。Dataflow は、ジョブを実行する VM のプールを割り当て、VM にコードをデプロイして、ジョブを実行するオーケストレーションを行います。
- Dataflow は、パイプラインを効率的に実行し、並列化を活用するために、バックエンドを最適化します。
- ジョブの実行中と完了後は、Dataflow 管理機能を使用して進捗状況をモニタリングし、トラブルシューティングを行います。
Apache Beam のコンセプト
このセクションでは、基本的なコンセプトの概要について説明します。
基本概念
- パイプライン
- パイプラインは、入力データの読み取り、そのデータの変換、出力データの書き込みに関連する、一連の計算全体をカプセル化したものです。入力ソースと出力シンクは同一でも別の型でもかまいません。ユーザーはデータの形式を変換できます。Apache Beam プログラムでは、まず、
Pipeline
オブジェクトを構築します。そのオブジェクトを基礎として使用し、パイプラインのデータセットを作成します。各パイプラインは、反復可能な 1 つのジョブを表します。 - PCollection
PCollection
は、パイプライン データとして機能する複数要素のデータセットを表します。このデータセットは分散して存在する可能性があります。Apache Beam 変換では、PCollection
オブジェクトをパイプラインの各ステップの入力と出力として使用します。PCollection
は、固定サイズのデータセット、または継続的に更新されるデータソースの制限なしデータセットを保持できます。- 変換
- 変換は、データを変換する処理オペレーションを表します。変換は、1 つ以上の
PCollection
を入力として受け取り、そのコレクションの各要素に対して指定したオペレーションを実行して、1 つ以上のPCollection
を出力として生成します。変換では、ほとんどすべての処理オペレーションを実行できます。これには、データに対する算術演算の実行、データの書式の変換、データのグループ化、データの読み取りと書き込み、必要な要素のみを出力するためのデータのフィルタ処理、1 つの値へのデータ要素の結合が含まれます。 - ParDo
ParDo
は、Apache Beam SDK のコア並列処理オペレーションです。入力PCollection
の各要素に対してユーザー指定の関数を呼び出します。ParDo
は、0 個以上の出力要素を 1 つの出力PCollection
に収集します。ParDo
変換は、要素を個別に、場合によっては並行して処理します。- パイプライン I/O
- Apache Beam I/O コネクタを使用すると、パイプラインにデータを読み込み、パイプラインから出力データを書き出すことができます。I/O コネクタは、ソースとシンクで構成されています。Apache Beam のすべてのソースとシンクの変換によって、さまざまなデータ ストレージ形式のデータをパイプラインが扱えるようになります。カスタム I/O コネクタを書き込むこともできます。
- 集計
- 集約は、複数の入力要素からなんらかの値を計算するプロセスです。Apache Beam における集約の主な計算パターンでは、すべての要素を共通のキーとウィンドウでグループ化します。次いで、連想演算と交換演算によって要素の各グループを結合します。
- ユーザー定義関数(UDF)
- Apache Beam 内の一部のオペレーションでは、変換を構成する方法としてユーザー定義コードを実行できます。
ParDo
では、ユーザー定義コードはすべての要素に適用するオペレーションを指定し、Combine
では、値の結合方法を指定します。パイプラインには、ランナーの言語とは異なる言語で書かれた UDF が含まれている場合があります。パイプラインには、複数の言語で書かれた UDF が含まれている場合もあります。 - ランナー
- ランナーは、パイプラインを受け入れて実行するソフトウェアです。ほとんどのランナーは、超並列ビッグデータ処理システムへの変換装置またはアダプタです。ローカルのテストとデバッグのための他のランナーも存在します。
- ソース
- 外部ストレージ システムから読み取る変換。パイプラインは通常、ソースから入力データを読み取ります。ソースのタイプとシンクのタイプは異なるものにすることができます。これにより、データがパイプライン内を移動するときにデータの形式を変更できます。
- Sink
- ファイルやデータベースなどの外部データ ストレージ システムに書き込む変換。
- TextIO
- テキスト ファイルの読み取りと書き込みを行うための PTransform。TextIO のソースとシンクは、
gzip
とbzip2
で圧縮されたファイルをサポートしています。TextIO 入力ソースは JSON をサポートしています。ただし、Dataflow サービスで入力を並列化できるように、ソースデータを改行で区切る必要があります。正規表現を使用して、TextIO ソースを持つ特定のファイルをターゲットにできます。Dataflow は、一般的なワイルドカード パターンをサポートしています。glob 式は、パスの任意の場所に使用できます。ただし、Dataflow は再帰的なワイルドカード(**
)をサポートしません。
高度なコンセプト
- イベント時間
- データイベントが発生する時間。データ要素自体のタイムスタンプに基づいています。これは、実際のデータ要素がパイプラインの任意のステージで処理される時間とは対照的です。
- ウィンドウ処理
- ウィンドウ処理では、制限なしコレクションに対するオペレーションをグループ化できます。これは、個々の要素のタイムスタンプに応じて、コレクションを有限コレクションのウィンドウに分割することによって行います。ウィンドウ処理機能で、ランナーに要素を初期ウィンドウに割り当てる方法、グループ化された要素のウィンドウをマージする方法を指示します。Apache Beam では、さまざまな種類のウィンドウを定義したり、定義済みのウィンドウ処理機能を使用したりできます。
- ウォーターマーク
- Apache Beam が追跡するウォーターマークは、特定のウィンドウのすべてのデータがパイプラインに届くときを予測するためのシステムの概念です。Apache Beam は、ウォーターマークを追跡します。データが時間順または予測可能な間隔で、パイプラインに到着することは保証されていないためです。さらに、データイベントが、その生成順序と同じ順序でパイプラインに届くという保証もありません。
- トリガー
- トリガーは、データが到着したときに集計結果をいつ出力するかを決定します。制限付きデータの場合、すべての入力が処理された後に結果が出力されます。制限なしデータの場合、ウォーターマークがウィンドウの境界を通過するときに結果が出力されます。また、そのウィンドウの入力データがすべて処理されたとシステムで推測していることを示します。Apache Beam は、いくつかの定義済みトリガーを提供し、それらを組み合わせることができます。
次のステップ
- Apache Beam SDK を使用してパイプラインを構築する基本概念については、Apache Beam ドキュメントの Apache Beam プログラミング ガイドをご覧ください。
- Dataflow でサポートされている Apache Beam の機能の詳細については、Apache Beam の機能マトリックスをご覧ください。