変換

Dataflow パイプラインで、変換はステップ(データを変換する処理オペレーション)を表します。変換では、ほとんどすべての処理オペレーションを実行できます。これには、データに対する算術演算の実行、データの書式の変換、データのグループ化、データの読み取りと書き込み、必要な要素のみを出力するためのデータのフィルタ処理、1 つの値へのデータ要素の結合が含まれます。

Dataflow モデルの変換はネストできます。つまり、変換に他の変換を含めてそれらを呼び出すことで、複合変換を形成できます。

変換の仕組み

変換はパイプラインの処理ロジックを表します。各変換は、1 つ(または複数)の PCollection を入力として受け取り、入力 PCollection の要素に対してオペレーションを実行し、1 つ(または複数)の新しい PCollection を出力として生成します。

Java

変換を使用するには、処理する入力 PCollection に対して、apply メソッドを呼び出して、入力 PCollection に変換を適用します。PCollection.apply を呼び出すとき、使用する変換を引数として渡します。出力 PCollectionPCollection.apply の戻り値です。

たとえば、次のコードサンプルは、ComputeWordLengths というユーザー定義の変換の applyPCollection<String> に対して行う方法を示しています。 ComputeWordLengths は、出力コレクションの各 String の長さを含む、新しい PCollection<Integer> を返します。

  // The input PCollection of word strings.
  PCollection<String> words = ...;

  // The ComputeWordLengths transform, which takes a PCollection of Strings as input and
  // returns a PCollection of Integers as output.
  static class ComputeWordLengths
      extends PTransform<PCollection<String>, PCollection<Integer>> { ... }

  // Apply ComputeWordLengths, capturing the results as the PCollection wordLengths.
  PCollection<Integer> wordLengths = words.apply(new ComputeWordLengths());

Dataflow プログラムを使用してパイプラインを構築するとき、組み込んだ変換が、指定した順序どおりに実行されないことがあります。たとえば、Cloud Dataflow 管理対象サービスでは実行が最適化されます。最適化された実行では、Dataflow サービスが、パイプラインに定義された入力と出力の正確な順序を推測して、変換を依存順序に並べます。最も効率よく実行されるように、特定の変換がマージされたり、違う順序で実行されたりすることがあります。

Dataflow SDK の変換の種類

コア変換

Dataflow SDK には、Cloud Dataflow 並列処理モデルの基盤となる少数のコア変換が含まれています。コア変換はパイプライン処理の基本構造です。各コア変換では、指定するビジネス ロジックを PCollection の要素に適用するための汎用処理フレームワークが提供されます。

コア変換を使用するとき、処理ロジックを関数オブジェクトとして指定します。指定する関数が、入力 PCollection の要素に適用されます。関数のインスタンスは、データセットの容量が大きい場合には、複数の Google Compute Engine インスタンスで並列に実行できます。このため、パイプライン ランナー サービスによって実行される最適化は保留されます。ワーカーコード関数では、出力 PCollection に追加される出力要素(ある場合)が生成されます。

ユーザー定義関数オブジェクトの要件

変換に指定する関数オブジェクトは、その多数のコピーが Cloud Platform プロジェクトにおいて複数の Compute Engine インスタンスで並列で実行される場合があります。そのため、このような関数を作成するときには次のことに注意する必要があります。

  • 関数オブジェクトをシリアル化する必要があります。
  • 関数オブジェクトにはスレッド互換性が必要です。また、Dataflow SDK はスレッドセーフではないことに注意してください。
  • 関数オブジェクトにべき等性を持たせることをおすすめします。

これらの要件は、DoFnParDo コア変換で使用)、CombineFnCombine コア変換で使用)、WindowFnWindow 変換で使用)のサブクラスに適用されます。

シリアル化可能

コア変換に指定する関数オブジェクトは、完全にシリアル化可能であることが必要です。ユーザーコードの基本クラス(DoFnCombineFnWindowFn など)はすでに Serializable を実装しています。また、サブクラスが、シリアル化できないメンバーを追加することはできません。

シリアル化可能であることに関するその他の注意事項を次に示します。

  • 関数オブジェクトの一時フィールドは、自動的にシリアル化されないため、Cloud Platform プロジェクト内でワーカー インスタンスに引き継がれません
  • シリアル化の前に、フィールドに大容量のデータをロードしないでください。
  • 関数オブジェクトの個々のインスタンスはデータを共有できません。
  • 適用後に関数オブジェクトを変化させても効果はありません。
  • 匿名内部クラス インスタンスを使用して関数オブジェクトをインラインで宣言するときは注意が必要です。非静的コンテキストでは、内部クラス インスタンスが、外側のクラスとその状態へのポインタを暗黙に含みます。この外側のクラスもシリアル化されるため、関数オブジェクトそのものに適用される注意事項はこの外部クラスにも適用されます。
スレッド互換であること

関数オブジェクトにはスレッド互換であることが必要です。独自のスレッドを明示的に複数作成しない限り、関数オブジェクトの各インスタンスは、ワーカー インスタンス上の 1 つのスレッドによってアクセスされます。ただし、Dataflow SDK はスレッドセーフではないことに注意してください。 関数オブジェクトに独自のスレッドを複数作成する場合、独自の同期化を提供する必要があります。静的メンバーはワーカー インスタンスに渡されないことと、関数の複数のインスタンスがさまざまなスレッドからアクセスされることに注意してください。

べき等性

関数オブジェクトにべき等性を持たせることをおすすめします。つまり、どのような入力を受け取っても、関数は常に同じ出力を生成します。べき等性は必須ではありませんが、関数がべき等性を持つようにすると、出力が決定性を持つため、変換のデバッグとトラブルシューティングが容易になります。

コア変換の種類

多くの場合、コア変換はパイプラインで直接使用されます。また、Dataflow SDK で提供される他の変換の多くは、コア変換を単位として実装されます。

Dataflow SDK では次のコア変換が定義されています。

  • ParDo: 汎用的な並列処理
  • GroupByKey: キー / 値ペアをキーに基づいてグループ化
  • Combine: コレクションまたはグループ化された値を結合
  • Flatten: コレクションをマージ

複合変換

Dataflow SDK は、複合変換(複数の下位変換から構築された変換)をサポートしています。Dataflow SDK での変換のモデルはモジュール式です。つまり、変換を構築して、他の変換と組み合わせて実装できます。複合変換は、複数のステップがネストされているパイプライン内の複雑なステップと考えることができます。

複合変換が役立つのは、複数のステップで構成される反復可能なオペレーションを作成する場合です。Dataflow SDK に含まれる作成済み変換の多く(CountTop など)は、このような種類の複合変換です。これらは、他の変換とまったく同じ方法で使用されます。

詳しくは、複合変換を作成するをご覧ください。

Dataflow SDK の事前作成済み変換

Dataflow SDK では多数の事前作成済み変換が提供されます。コア変換と複合変換の両方があり、処理ロジックがすでに記述されています。これらは、データの結合、分割、処理、統計分析の実行などのための比較的複雑な変換です。

Java

これらの変換は com.google.cloud.dataflow.sdk.transforms パッケージおよびサブパッケージに含まれています。

Dataflow SDK で提供される変換の使用方法について詳しくは、SDK に含まれる変換をご覧ください。

データの読み取りと書き込みのためのルート変換

Dataflow SDK では、データをパイプラインに取り入れたり取り出したりするために、ルート変換と呼ばれる特別な変換が用意されています。これらの変換はパイプライン内でいつでも使用できますが、多くの場合、パイプラインのルートとエンドポイントで使用されます。これには、読み取り変換、書き込み変換、作成変換が含まれます。

読み取り変換は、パイプラインのルートで初期 PCollection を作成するために使用できますが、さまざまなソースからパイプライン データを作成します。これらのソースには、Google Cloud Storage のテキスト ファイル、BigQuery や Pub/Sub に格納されているデータ、他のクラウド ストレージ ソースが含まれます。Dataflow SDK では、独自のカスタム データソースを扱うための拡張可能 API も提供されます。

書き込み変換は、パイプラインのエンドポイントで、処理された出力データを含む PCollection 外部ストレージに書き込むために使用されます。外部データ ストレージ シンクには、Google Cloud Storage のテキスト ファイル、BigQuery テーブル、Pub/Sub、他のクラウド ストレージ メカニズムが含まれます。

作成変換は、インメモリ データから PCollection を作成するときに役立ちます。詳しくは、PCollection を作成するをご覧ください。

読み取り変換と書き込み変換について詳しくは、パイプライン I/O をご覧ください。

複数の入力と出力に対応する変換

一部の変換は、複数の PCollection 入力または特殊な副入力を受け取ります。また、変換によって複数の PCollection 出力と副出力が生成されることがあります。Dataflow SDK で提供されるタグ付け API は、さまざまな型の複数の入力と出力を追跡したり渡したりするときに役立ちます。

複数の入力と出力に対応する変換とタグ付け方法について詳しくは、複数の PCollection を処理するをご覧ください。

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

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

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