パイプライン設計の原則

このページは、Google Cloud Dataflow パイプラインの設計に役立ちます。パイプラインの構造の決定方法、データに適用する変換の選択方法、入力および出力方法の決定方法に関する情報が含まれます。

このセクションを読む前に、パイプラインPCollection変換パイプライン I/O などの Cloud Dataflow プログラミング モデルをよく理解しておくことをおすすめします。

パイプライン設計時の考慮事項

Cloud Dataflow パイプラインを設計する場合は、いくつかの基本的な質問について検討します。

  • 入力データはどこに格納しますか。 入力データは何セットありますか。これにより、パイプラインの開始時に適用する必要のある Read 変換の種類が決まります。
  • データはどのような形式ですか。 たとえば、プレーンテキスト、書式設定されたログファイル、BigQuery テーブルの行などがあります。一部の Dataflow 変換は、Key-Value ペアの PCollection に対してのみ動作します。データにキーを付けるかどうかおよびその方法と、パイプラインの PCollection でそれを最適に表現する方法を決定する必要があります。
  • データにはどのような処理を行いますか。 Dataflow SDK のコア変換は汎用です。データをどのように変更または操作する必要があるかを把握すれば、ParDo などのコア変換を構築する方法や、Dataflow SDK に付属の作成済み変換をいつ使用するかが決まります。
  • 出力データはどのような外観になり、どこに格納されますか。 これにより、パイプラインの最後に適用する必要のある Write 変換の種類が決まります。

基本パイプライン

最も単純なパイプラインは、次の図 1 に示すように、線形のオペレーション フローを表します。

図 1: 線形パイプライン

ただし、実際のパイプラインは大幅に複雑になることがあります。パイプラインは、各ステップからなる有向非巡回グラフを表します。複数の入力ソース、複数の出力シンクを持つことができ、そのオペレーション(変換)は複数の PCollection を出力できます。

さまざまなパイプライン形状

次の例では、パイプラインがとることのできるさまざまな形状の一部を示します。

分岐する PCollection

変換は PCollection を消費しないことを理解することが重要です。代わりに、PCollection の個々の要素を検討し、新しい PCollection を出力として作成します。このため、同じ PCollection 内のさまざまな要素に異なるオペレーションを実行できます。

複数の変換が同じ PCollection を処理する

入力を使用または変更せずに、同じ PCollection を複数の変換の入力として使用できます。

次の図 2 に示すパイプラインは、単一ソース Google BigQuery から名(ファースト ネーム、文字列)を入力として読み取り、BigQuery テーブル行からなる PCollection を作成します。次に、パイプラインは複数の変換を同じ PCollection に適用します。変換 A は、その PCollection 内で文字 'A' から始まるすべての名前を抽出し、変換 B は、その PCollection 内で文字 'B' から始まるすべての名前を抽出します。変換 A と B の両方が同じ入力 PCollection を持ちます。

図 2: 複数の変換があるパイプライン。BigQuery テーブル行の PCollection は 2 つの変換によって処理されています。

副出力を使用する単一変換

パイプラインを分岐する別の方法として、副出力を使用して、単一の変換で複数の PCollection に出力できます。副出力を使用する変換は、入力の各要素を 1 回処理し、ゼロ以上の PCollection に出力できます。

次の図 3 は、上で説明したのと同じ例を示していますが、副出力を使用する 1 つの変換があります。'A' で始まる名前は出力 PCollection に追加され、'B' で始まる名前は副出力 PCollection に追加されます。

図 3: 複数の 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 を使用することに意味があります。

図 4: 複数の PCollection をマージするパイプラインの一部

複数のソース

パイプラインでは、1 つ以上のソースから入力を読み取ることができます。パイプラインが複数のソースから読み取り、それらのソースのデータが関連している場合は、入力を結合すると便利な場合があります。次の図 5 に示す例では、パイプラインは BigQuery から名前と住所を読み取り、Google Cloud Storage から名前と注文番号を読み取ります。パイプラインは、CoGroupByKey を使用してこの情報を結合します。この場合、キーは名前です。結果として生成される PCollection には、名前、住所、注文のすべての組み合わせが含まれます。

図 5: 複数の入力ソースがあるパイプライン。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。