Dataflow スナップショットを使用する

Dataflow スナップショットはストリーミング パイプラインの状態を保存します。これにより、Dataflow ジョブの新しいバージョンを、状態を保持したまま開始できます。スナップショットは、バックアップと復元、ストリーミング パイプラインの更新のテストとロールバック、その他の同様のシナリオに対して有用です。

実行中のストリーミング ジョブの Dataflow スナップショットを作成できます。スナップショットから作成する新しいジョブは、Streaming Engine を使用します。また、Dataflow スナップショットを使用して、既存のパイプラインを、より効率的かつスケーラブルな Streaming Engine に、最小限のダウンタイムで移行することもできます。

このガイドでは、スナップショットの作成方法、スナップショットの管理方法、スナップショットからのジョブの作成方法について説明します。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs.

    Enable the APIs

スナップショットを作成する

コンソール

  1. Google Cloud コンソールで、Dataflow の [ジョブ] ページに移動します。

    [ジョブ] に移動

    Dataflow ジョブのリストとそれぞれのステータスが表示されます。ストリーミング ジョブが表示されない場合は、新しいストリーミング ジョブを実行する必要があります。ストリーミング ジョブの例については、テンプレートの使用のクイックスタートをご覧ください。

  2. ジョブを選択します。
  3. [ジョブの詳細] ページのメニューバーで、[スナップショットを作成] をクリックします。
  4. [スナップショットの作成] ダイアログで、次のいずれかのオプションを選択します。
    • データソースなし: このオプションを選択すると、Dataflow ジョブの状態のスナップショットのみが作成されます。
    • データソース付き: このオプションを選択すると、Dataflow ジョブの状態のスナップショットと、Pub/Sub ソースのスナップショットの両方が作成されます。
  5. [作成] をクリックします。

gcloud

スナップショットの作成

gcloud dataflow snapshots create \
    --job-id=JOB_ID \
    --snapshot-ttl=DURATION \
    --snapshot-sources=true \
    --region=REGION

次のように置き換えます。

  • JOB_ID: ストリーミング ジョブ ID。
  • DURATION: スナップショットが期限切れになるまでの時間(日数)。この期間を経過すると、スナップショットからジョブが作成できなくなります。snapshot-ttl フラグは省略可能です。指定しない場合、スナップショットは 7 日後に期限切れになります。5d の形式で値を指定します。指定できる最大の期間は 30 日(30d)です。
  • REGION: ジョブが実行されているリージョン。

snapshot-sources フラグは、Dataflow スナップショットとともに Pub/Sub ソースのスナップショットを作成するかどうかを指定します。true の場合、Pub/Sub ソースが自動的にスナップショットされ、Pub/Sub スナップショット ID が出力レスポンスに表示されます。create コマンドを実行した後、list または describe コマンドのいずれかを実行して、スナップショットのステータスを確認します。

Dataflow スナップショットの作成時には、以下のことが適用されます。

  • Dataflow のスナップショットでは、ディスク使用量に対して料金が発生します。
  • スナップショットは、ジョブと同じリージョンに作成されます。
  • ジョブのワーカーのロケーションがジョブのリージョンと異なる場合、スナップショットの作成は失敗します。Dataflow のリージョン ガイドをご覧ください。
  • ストリーミング エンジン以外のジョブのスナップショットを取得できるのは、2021 年 2 月 1 日より後にジョブが開始または更新された場合のみです。
  • Dataflow のスナップショットを使用して作成された Pub/Sub スナップショットは、Pub/Sub サービスによって管理され、料金が発生します
  • Pub/Sub スナップショットは、作成後 7 日以内に期限切れになります。正確な有効期間は、ソース サブスクリプションの既存のバックログによって決まります。Pub/Sub スナップショットの有効期間は 7 days - (age of oldest unacked message in the subscription) です。たとえば、サブスクリプションで最も古い未確認メッセージが 3 日前のものだとします。このサブスクリプションから Pub/Sub スナップショットが作成された場合、スナップショットは 4 日後に期限切れになります(スナップショットが存在する間、この 3 日前のバックログが常にキャプチャされます)。Pub/Sub スナップショットのリファレンスをご覧ください。
  • スナップショット オペレーションでは Dataflow ジョブが一時停止し、スナップショットの準備が整った後で再開します。必要な時間は、パイプラインの状態のサイズによって異なります。たとえば、Streaming Engine ジョブのスナップショットの作成に必要な時間は、通常、Streaming Engine 以外のジョブよりも短くなります。
  • スナップショットの実行中にジョブをキャンセルできます。ジョブがキャンセルされると、スナップショットもキャンセルされます。
  • スナップショットの進行中には、ジョブを更新またはドレインすることはできません。ジョブを更新またはドレインするには、ジョブがスナップショット プロセスから再開されるまで待機する必要があります。

スナップショット ページを使用する

スナップショットを作成した後で、Google Cloud コンソールの [スナップショット] ページでプロジェクトのスナップショットを表示、管理できます。

スナップショットをクリックすると、[スナップショットの詳細] ページが開き、スナップショットに関する追加のメタデータの他に、ソースジョブと Pub/Sub スナップショットへのリンクを確認できます。

スナップショットの詳細情報を確認できる Dataflow スナップショットの詳細ページ。

スナップショットを削除する

スナップショットを削除すると、スナップショット プロセスを停止してジョブを再開できます。Dataflow スナップショットを削除しても、関連付けられている Pub/Sub スナップショットは自動的には削除されません。

コンソール

  1. Google Cloud コンソールで Dataflow の [スナップショット] ページに移動します。

    [スナップショット] に移動

  2. スナップショットを選択し、[削除] をクリックします。
  3. [スナップショットの削除] ダイアログで、[削除] をクリックして確定します。

gcloud

スナップショットの削除:

gcloud dataflow snapshots delete SNAPSHOT_ID \
    --region=REGION

次のように置き換えます。

  • SNAPSHOT_ID: スナップショット ID
  • REGION: スナップショットが存在するリージョン

詳細については、delete コマンド リファレンスをご覧ください。

スナップショットからジョブを作成する

スナップショットを作成した後で、そのスナップショットから新しいジョブを作成して、Dataflow ジョブの状態を復元できます。

Java

スナップショットから新しいジョブを作成するには、--createFromSnapshot フラグと --enableStreamingEngine フラグの両方を使用します。

  • シェルまたはターミナルで、スナップショットから新しいジョブを作成します。次に例を示します。
    mvn -Pdataflow-runner compile exec:java \
        -Dexec.mainClass=MAIN_CLASS \
        -Dexec.args="--project=PROJECT_ID \
        --stagingLocation=gs://STORAGE_BUCKET/staging/ \
        --inputFile=gs://apache-beam-samples/shakespeare/* \
        --output=gs://STORAGE_BUCKET/output \
        --runner=DataflowRunner \
        --enableStreamingEngine \
        --createFromSnapshot=SNAPSHOT_ID \
        --region=REGION"

    次のように置き換えます。

    • MAIN_CLASS または MODULE: Java パイプラインの場合は、パイプライン コードを含むメインクラスのロケーション。Python パイプラインの場合は、パイプライン コードを含むモジュールのロケーション。たとえば、Wordcount の例の場合、値は org.apache.beam.examples.WordCount です。
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID
    • STORAGE_BUCKET: 一時的なジョブアセットと最終出力に使用する Cloud Storage バケット
    • SNAPSHOT_ID: 新しいジョブの作成元となるスナップショットのスナップショット ID
    • REGION: 新しい Dataflow ジョブを実行するロケーション

Python

Dataflow のスナップショットには、Apache Beam SDK for Python のバージョン 2.29.0 以降が必要です。

スナップショットから新しいジョブを作成するには、--createFromSnapshot フラグと --enableStreamingEngine フラグの両方を使用します。

  • シェルまたはターミナルで、スナップショットから新しいジョブを作成します。次に例を示します。
    python -m MODULE \
        --project PROJECT_ID \
        --temp_location gs://STORAGE_BUCKET/tmp/ \
        --input gs://apache-beam-samples/shakespeare/* \
        --output gs://STORAGE_BUCKET/output \
        --runner DataflowRunner \
        --enable_streaming_engine \
        --create_from_snapshot=SNAPSHOT_ID \
        --region REGION \
        --streaming

    次のように置き換えます。

    • MAIN_CLASS または MODULE: Java パイプラインの場合は、パイプライン コードを含むメインクラスのロケーション。Python パイプラインの場合は、パイプライン コードを含むモジュールのロケーション。たとえば、Wordcount の例の場合、値は org.apache.beam.examples.WordCount です。
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID
    • STORAGE_BUCKET: 一時的なジョブアセットと最終出力に使用する Cloud Storage バケット
    • SNAPSHOT_ID: 新しいジョブの作成元となるスナップショットのスナップショット ID
    • REGION: 新しい Dataflow ジョブを実行するロケーション

Dataflow スナップショットからジョブを作成する場合、次の内容が適用されます。

  • スナップショットから作成されたジョブは、スナップショットが保存されているのと同じリージョンで実行する必要があります。
  • Dataflow スナップショットに Pub/Sub ソースのスナップショットが含まれている場合、Dataflow スナップショットから作成されたジョブは、それらの Pub/Sub スナップショットをソースとして自動的に seek します。Dataflow スナップショットからジョブを作成するときに、ソースジョブで使用されるのと同じ Pub/Sub トピックを指定する必要があります。

  • Dataflow スナップショットに Pub/Sub ソースのスナップショットが含まれておらず、ソースジョブが Pub/Sub ソースを使用している場合は、その Dataflow スナップショットからジョブを作成する際に Pub/Sub トピックを指定する必要があります。

  • スナップショットから作成された新しいジョブは、引き続き更新の互換性チェックの対象になります。

既知の制限事項

Dataflow スナップショットには、次の制限事項が適用されます。

  • テンプレートまたは Dataflow SQL エディタを使用して、スナップショットからジョブを作成することはできません。
  • スナップショットの有効期限は Google Cloud CLI でのみ設定できます。
  • Dataflow のスナップショットは、Pub/Sub のソース スナップショットのみをサポートします。
  • シンクのスナップショットはサポートされていません。たとえば、Dataflow スナップショットを作成するときに BigQuery スナップショットを作成することはできません。

トラブルシューティング

このセクションでは、Dataflow スナップショットの操作時に発生する一般的な問題のトラブルシューティングについて説明します。

サポートにお問い合わせいただく前に、発生している問題が既知の制限事項に該当していないことを確認してください。また、以下のトラブルシューティングの説明に該当する問題でないことも確認してください。

スナップショット作成リクエストが拒否された

Google Cloud コンソールまたは gcloud CLI のいずれかからスナップショット作成リクエストを送信すると、Dataflow サービスは前提条件のチェックを行い、エラー メッセージを返します。スナップショットの作成リクエストは、ジョブの種類がサポートされていない場合や、リージョンが使用できない場合など、さまざまな理由で拒否されることがあり、その理由はエラー メッセージで示されます。

ジョブが古すぎるためにリクエストが拒否された場合は、スナップショットをリクエストする前にジョブを更新する必要があります。

スナップショットの作成に失敗した

スナップショットの作成が失敗する原因はいくつかあります。たとえば、ソースジョブがキャンセルされた、Pub/Sub スナップショットを作成するための適切な権限がプロジェクトに与えられていないなどです。ジョブの job-message ログには、スナップショットの作成で出力されたエラー メッセージが含まれています。スナップショットの作成に失敗すると、ソースジョブが再開されます。

スナップショットからのジョブの作成に失敗した

スナップショットからジョブを作成するときは、スナップショットが存在し、期限切れになっていないことを確認します。新しいジョブは Streaming Engine で実行する必要があります。

ジョブの作成に関する一般的な問題については、Dataflow のトラブルシューティング ガイドをご覧ください。特に、スナップショットから作成された新しいジョブは更新の互換性チェックの対象となり、新しいジョブはスナップショットのソースジョブと互換性を持つ必要があります。

スナップショットからのジョブの作成がほとんど進まない

ジョブの job-message ログには、ジョブの作成で出力されたエラー メッセージが含まれています。たとえば、ジョブで Pub/Sub スナップショットが見つからないことがあります。この場合、Pub/Sub スナップショットが存在し、有効期限切れになっていないことを確認してください。スナップショット内の最も古いメッセージが 7 日以上古くなると、Pub/Sub スナップショットは直ちに有効期限切れになります。期限切れの Pub/Sub スナップショットは、Pub/Sub サービスによって自動的に削除される可能性があります。

Pub/Sub ソース スナップショットを含む Dataflow スナップショットから作成されたジョブの場合、新しいジョブに大量の Pub/Sub バックログが存在し、処理を必要とすることがあります。ストリーミングの自動スケーリングを使用すると、新しいジョブがバックログをより迅速に処理できる場合があります。

スナップショットが作成されたソースジョブが、スナップショットの作成前にすでに異常な状態になっていた可能性があります。ソースジョブが異常である理由がわかると、新しいジョブの問題の解決に役立ちます。ジョブのデバッグに関する一般的なヒントについては、Dataflow のトラブルシューティング ガイドをご覧ください。