このページは、Google Cloud Dataflow パイプラインの設計に役立ちます。パイプラインの構造の決定方法、データに適用する変換の選択方法、入力および出力方法の決定方法に関する情報が含まれます。
このセクションを読む前に、パイプライン、PCollection、変換、パイプライン I/O などの Cloud Dataflow プログラミング モデルをよく理解しておくことをおすすめします。
パイプライン設計時の考慮事項
Cloud Dataflow パイプラインを設計する場合は、いくつかの基本的な質問について検討します。
- 入力データはどこに格納しますか。 入力データは何セットありますか。これにより、パイプラインの開始時に適用する必要のある Read 変換の種類が決まります。
- データはどのような形式ですか。 たとえば、プレーンテキスト、書式設定されたログファイル、BigQuery テーブルの行などがあります。一部の Dataflow 変換は、Key-Value ペアの
PCollection
に対してのみ動作します。データにキーを付けるかどうかおよびその方法と、パイプラインのPCollection
でそれを最適に表現する方法を決定する必要があります。 - データにはどのような処理を行いますか。 Dataflow SDK のコア変換は汎用です。データをどのように変更または操作する必要があるかを把握すれば、ParDo などのコア変換を構築する方法や、Dataflow SDK に付属の作成済み変換をいつ使用するかが決まります。
- 出力データはどのような外観になり、どこに格納されますか。 これにより、パイプラインの最後に適用する必要のある Write 変換の種類が決まります。
基本パイプライン
最も単純なパイプラインは、次の図 1 に示すように、線形のオペレーション フローを表します。
ただし、実際のパイプラインは大幅に複雑になることがあります。パイプラインは、各ステップからなる有向非巡回グラフを表します。複数の入力ソース、複数の出力シンクを持つことができ、そのオペレーション(変換)は複数の PCollection
を出力できます。
さまざまなパイプライン形状
次の例では、パイプラインがとることのできるさまざまな形状の一部を示します。
分岐する PCollection
変換は PCollection
を消費しないことを理解することが重要です。代わりに、PCollection
の個々の要素を検討し、新しい PCollection
を出力として作成します。このため、同じ PCollection
内のさまざまな要素に異なるオペレーションを実行できます。
複数の変換が同じ PCollection を処理する
入力を使用または変更せずに、同じ PCollection
を複数の変換の入力として使用できます。
次の図 2 に示すパイプラインは、単一ソース Google BigQuery から名(ファースト ネーム、文字列)を入力として読み取り、BigQuery テーブル行からなる PCollection
を作成します。次に、パイプラインは複数の変換を同じ PCollection
に適用します。変換 A は、その PCollection
内で文字 'A' から始まるすべての名前を抽出し、変換 B は、その PCollection
内で文字 'B' から始まるすべての名前を抽出します。変換 A と B の両方が同じ入力 PCollection
を持ちます。
副出力を使用する単一変換
パイプラインを分岐する別の方法として、副出力を使用して、単一の変換で複数の PCollection
に出力できます。副出力を使用する変換は、入力の各要素を 1 回処理し、ゼロ以上の PCollection
に出力できます。
次の図 3 は、上で説明したのと同じ例を示していますが、副出力を使用する 1 つの変換があります。'A' で始まる名前は出力 PCollection
に追加され、'B' で始まる名前は副出力 PCollection
に追加されます。
図 2 のパイプラインには、同じ入力 PCollection
の要素を処理する 2 つの変換が含まれています。一方の変換は、次の論理パターンを使用します。
if (starts with 'A') { outputToPCollectionA }
もう一方の変換は次のパターンを使用します。
if (starts with 'B') { outputToPCollectionB }
各変換は入力 PCollection
全体を読み取るため、入力 PCollection
の各要素は 2 回処理されます。
図 3 のパイプラインは、次のロジックを使用する 1 つの変換のみを使用して、同じオペレーションを異なる方法で実行します。
if (starts with 'A') { outputToPCollectionA } else if (starts with 'B') { outputToPCollectionB }
ここでは、入力 PCollection
の各要素が 1 回処理されます。
どちらのメカニズムを使用しても複数の出力 PCollection
を生成できます。ただし、変換の要素ごとの計算に時間がかかる場合は、副出力を使用するほうが有利です。
PCollection をマージする
複数の変換を介して PCollection
を複数の PCollection
に分岐した後で、結果として生成される PCollection
の一部またはすべてをマージする必要があります。このオペレーションは、次のいずれかを使用して行うことができます。
- フラット化 - Dataflow SDK の Flatten 変換を使用して、同じタイプの複数の
PCollection
をマージできます。 - 結合 - Dataflow SDK の CoGroupByKey 変換を使用して、2 つの
PCollection
間の関係結合を実行できます。PCollection
にはキーを付ける必要があり(つまり、Key-Value ペアのコレクションである必要があります)、同じキータイプを使用する必要があります。
次の図 4 で示す例は、上のセクションの図 2 で示した例の続きです。'A' で始まる名前と 'B' で始まる名前の 2 つの PCollection
に分岐した後で、パイプラインは 2 つを単一の PCollection
にマージし、これには 'A' または 'B' で始まるすべての名前が含まれるようになります。ここでは、マージされる PCollection
の両方に同じタイプが含まれるため、Flatten
を使用することに意味があります。
複数のソース
パイプラインでは、1 つ以上のソースから入力を読み取ることができます。パイプラインが複数のソースから読み取り、それらのソースのデータが関連している場合は、入力を結合すると便利な場合があります。次の図 5 に示す例では、パイプラインは BigQuery から名前と住所を読み取り、Google Cloud Storage から名前と注文番号を読み取ります。パイプラインは、CoGroupByKey
を使用してこの情報を結合します。この場合、キーは名前です。結果として生成される PCollection
には、名前、住所、注文のすべての組み合わせが含まれます。