パイプライン設計の原則

このページは、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 回処理し、0 以上の 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: 複数の入力ソースがあるパイプライン。

次のステップ