Apache Beam は、バッチとストリーミングの両方のデータの並列処理パイプラインを定義するオープンソースの統合モデルです。Apache Beam プログラミング モデルは、大規模なデータ処理の構造を単純化します。Apache Beam SDK の 1 つを使用して、パイプラインを定義するプログラムを構築します。次いで、Dataflow などの Apache Beam がサポートする分散処理バックエンドの 1 つがパイプラインを実行します。このモデルのおかげで、並列処理の物理的なオーケストレーションではなく、データ処理ジョブの論理的な構成に集中できます。つまり、ジョブの実行方法ではなく、ジョブの実行内容に焦点を絞ることができます。
Apache Beam モデルでは、有効な抽象化が提供されるため、分散処理の下層部分の細かい設定(個々のワーカーの調整やデータセットの分割などのタスク)をユーザーが扱う必要がなくなります。Dataflow ではこれらの下層レベルの細かい設定が完全に管理されます。
Apache Beam のコンセプト
このセクションでは、基本的なコンセプトの概要について説明します。
- Apache Beam SDK を使用してパイプラインを構築する基本的なコンセプトについては、Apache Beam ドキュメントの Apache Beam プログラミング ガイドをご覧ください。
- Dataflow でサポートされている Apache Beam の機能の詳細については、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 ウェブサイトの Apache Beam プログラミング ガイドをご覧ください。
Apache Beam® は、Apache Software Foundation または米国その他の諸国における関連会社の商標です。