Dataflow SDK では、パイプラインはデータ処理ジョブに相当します。パイプラインを作成するには、Dataflow SDK を使用してプログラムを記述します。パイプラインは、入力データのソースを読み取り、そのデータを変換し、結果の出力を書き込む、一連のオペレーションで構成されます。パイプライン内のデータと変換は、そのパイプラインに固有のものであり、そのパイプラインによって所有されます。1 つのプログラムで複数のパイプラインを作成できますが、複数のパイプラインがデータまたは変換を共有することはできません。
パイプラインは複雑にすることも単純にすることもできます。パイプラインが比較的単純で直線的になるのは、一連の変換が順番に実行される場合です。あるいは、パイプラインの分岐やマージも可能です。このように、パイプラインは、ステップの直線的なシーケンスではなく、ステップの有向グラフと考えてください。パイプラインの作成では、条件、ループ、その他のプログラミング構造を使用することで、この有向グラフが作成されます。
注: Dataflow SDK を使用してプログラムを記述すると、プログラムによってパイプラインの仕様が作成されます。この仕様は、Cloud Dataflow サービスまたはサードパーティ ランナーであるパイプライン ランナーに送られます。パイプライン ランナーは実際のパイプラインを非同期で実行します。テストとデバッグの際にはパイプラインをローカルで実行することもできます。
パイプライン ランナーによって、分散実行のために実際のパイプラインが構築されるときに、パイプラインが最適化される場合があります。たとえば、特定の複数の変換をまとめて実行したり、別の順序で実行する方が効率的に処理できることがあります。パイプラインの実行のこの部分は、Dataflow サービスによって全面的に管理されます。
パイプラインの各部
パイプラインは、データと、そのデータに適用される変換という 2 つの部分で構成されます。Dataflow SDK によって、データと変換の両方を表すクラスが提供されます。Dataflow SDK はデータクラスと変換クラスを結び付けて、パイプライン全体を作成します。Dataflow SDK のクラスを使用してパイプラインを作成する手順について詳しくは、パイプラインを作成するをご覧ください。
パイプライン データ
Dataflow SDK では、パイプラインは入力データ、中間データ、出力データを表すために PCollection
という特殊なコレクション クラスを使用します。
PCollection
を使用すると、実質的にあらゆるサイズのデータセットを表すことができます。Java の Collection
のような一般的なコレクション クラスと異なり、PCollection
は並列処理をサポートするように特別に設計されています。
パイプラインは、処理する必要があるすべてのデータに対して PCollection
を作成する必要があります。外部ソースのデータを PCollection
に読み込むことができます。あるいは、Dataflow プログラムのローカルデータから PCollection
を作成できます。その後、パイプライン内の各変換が 1 つ以上の PCollection
を入力として受け取り、1 つ以上の PCollection
を出力として生成します。
PCollection
の仕組みと使用方法については、PCollection をご覧ください。
パイプラインの変換
変換はパイプライン内のステップです。各変換は 1 つ以上の PCollection
を入力として取り、その PCollection
の要素に対して変更またはその他の処理を行ってから、1 つ以上の新しい PCollection
を出力として生成します。
コア変換
Dataflow SDK には多数のコア変換が含まれています。コア変換は、パイプライン データに対して実行する基本的な処理または共通の処理を表す一般的なオペレーションです。ほとんどのコア変換では処理パターンが提供され、ユーザーが、入力 PCollection
に適用する実際の処理ロジックを作成して指定する必要があります。
たとえば、ParDo コア変換では一般的な処理パターンが提供されます。つまり、入力 PCollection
の要素ごとに、その要素に対するユーザー指定の処理関数を実行します。Dataflow SDK では、ParDo や GroupByKey のようなコア変換に加えて、データセットの組み合わせ、マージ、分割のための他のコア変換が提供されます。
パイプラインで変換を使用する方法について詳しくは、変換をご覧ください。
複合変換
Dataflow SDK では、複数の変換を組み合わせた大きな複合変換がサポートされます。複合変換では、複雑なデータ処理オペレーションを実行するために、複数の変換がデータセットに適用されます。複合変換は、便利な処理を実行する、モジュール式の再利用可能な変換の組み合わせを構築するのに適した方法です。
Dataflow SDK には作成済み複合変換のライブラリがあり、次のような一般的なデータ処理の事例に対応しています(ただし、これらに限定されません)。
- データの組み合わせ(数値データの合計や平均など)
- Map / Shuffle / Reduce スタイルの処理(コレクション内の一意要素のカウントなど)
- 統計分析(コレクション内の上位 N 件の要素の検索など)
独自の再利用可能な複合変換を作成することもできます。詳細については、複合変換を作成するをご覧ください。
ルート変換
多くの場合、Dataflow SDK はパイプラインの最初でルート変換を使用して、初期 PCollection を作成します。ルート変換では外部データソースからのデータの読み取りがよく行われます。詳細については、パイプライン I/O をご覧ください。
簡単なパイプラインの例
次の例は、3 つの変換を含むパイプラインの作成と実行を示します。含まれるのは、データを読み取る変換、データをカウントする変換、カウントした結果を書き込む変換です。
注: Dataflow SDK のクラスを使用してパイプラインを作成する方法について詳しくは、パイプラインを構築するをご覧ください。
パイプラインを作成する際の一般的な手法では、変換を「チェーン」でつなぎます。変換をチェーンでつなぐには、次の例に示すように、前の変換で生成された PCollection
に後続の変換を直接適用します。
Java
public static void main(String[] args) { // Create a pipeline parameterized by commandline flags. Pipeline p = Pipeline.create(PipelineOptionsFactory.fromArgs(args)); p.apply(TextIO.Read.from("gs://...")) // Read input. .apply(new CountWords()) // Do some processing. .apply(TextIO.Write.to("gs://...")); // Write output. // Run the pipeline. p.run(); }
この例では、apply
の最初の呼び出しが、ルート変換を呼び出して、(このケースではファイルのデータを読み取って)PCollection
を作成します。apply
に対する後続の呼び出しそれぞれは、生成される PCollection
に対して呼び出されます。
注: チェーン全体の戻り値は保存されません。Write
変換に対する最後の apply
呼び出しは、PCollection
ではなく、PDone
の自明な値が返されます。通常、PDone
は無視されます。