pause-on-failure サービス オプションを使用して、Dataflow バッチジョブの状態を保持します。この機能を使用すると、ジョブの実行を一時停止し、パイプラインの外部にある問題に対処して、完了した作業を失うことなく処理を再開できます。この機能を使用してジョブを一時停止すると、パイプライン コードやワーカー VM 構成(マシンタイプなど)を変更できなくなります。
この機能を有効にすると、一時的な停止や割り当ての制約が発生した場合に、リソース費用をより適切に管理し、ジョブの信頼性を向上させることができます。pause-on-failure を有効にするときに最大一時停止期間を構成することで、パイプラインのライフサイクルをさらに制御できます。pause-on-failure フラグが有効になっているパイプラインを手動で一時停止または再開することもできます。
失敗時に一時停止するメリット
pause-on-failure サービス オプションを使用すると、中断中にバッチジョブの進行状況を保持できるため、合計コンピューティング時間とリソース費用を削減できます。
- チェックポイントの保持: ジョブが失敗した場合、最初から再開するのではなく、最後に記録されたチェックポイントから再開できます。これにより、完了したデータブロックを再処理する必要がなくなり、正常に完了した作業をやり直すために費用を支払う必要がなくなります。
- 外部依存関係を軽減する: 外部サービスの一時的な停止やレート制限など、一時的な問題からパイプラインを保護します。ジョブを一時停止すると、完了した作業を失うことなく、実行を再開する前に根本原因に対処できます。
- 非決定論的障害を処理する: 断続的または非決定論的な障害が発生しやすいワークロードの場合、このオプションを使用すると、各シーケンシャル試行で増分進行を確保し、ジョブの完全な失敗を防ぐことができます。
- リソースと割り当てを管理する: 優先度の低いバッチジョブを一時停止して、割り当てを一時的に解放したり、GPU や TPU などの価値の高いリソースを、ベースラインの進行状況を失うことなく、機械学習モデルのトレーニングや推論などの緊急性の高いワークロードに再割り当てしたりします。
サポートと制限事項
ジョブの一時停止(手動または失敗時)には、次の要件と制限があります。
- Dataflow ジョブはバッチジョブである必要があります。
- ジョブは Dataflow Shuffle を使用する必要があります。
- ジョブを実行する場合は、
pause_on_failureサービス オプションを指定する必要があります。 - ジョブが以前に一時停止に失敗していない必要があります。
- ジョブが一時停止している間は、ジョブの一時ディレクトリの内容を削除してはなりません。
失敗時に一時停止するジョブの動作
失敗時に一時停止機能を有効にすると、ワークアイテムが 4 回失敗した後にジョブが自動的に一時停止します。これらの障害は、ログで Error message from worker を含むジョブ メッセージと Completed work item ITEM_NUMBER
UNSUCCESSFULLY を含むワーカー メッセージとして特定されます。在庫切れや割り当てエラーなどの他のタイプの障害では、自動一時停止はトリガーされません。代わりに、これらの障害によりジョブは通常どおり失敗します。pause-on-failure を有効にすると、ジョブを手動で一時停止することもできます。
ジョブの状態遷移
Dataflow ジョブが一時停止すると、次の状態に移行します。
- 一時停止: ジョブが処理を停止し、ワーカー VM を削除して、バックエンドの状態をアーカイブする中間状態。サービスが VM の削除を完了するまで、VM の料金は引き続き請求されます。
- 一時停止: ジョブは完全に停止しています。この時点では、アーカイブされた Shuffle データに対してのみ課金されます。
例外的な動作
次のシナリオでは、失敗時に一時停止が予期しない動作をすることがあります。
- 完了間近のジョブを手動で一時停止すると、ジョブが一時停止ではなく完了することがあります。
- まれに、ジョブが一時停止しないことがあります。このような場合、手動で一時停止したジョブは実行状態に戻り、エラーが原因で一時停止しているジョブは失敗状態になります。
処理を再開する
ジョブが再開されると、サービスは次のように作業項目を処理します。
- 完了した作業: ジョブが一時停止したときに完全に完了していたステージや作業項目は、再処理されません。
- 進行中の作業: ジョブが一時停止したときに進行中だった作業項目は、最初から再処理されます。
- 失敗回数: すべての作業項目の失敗回数がゼロにリセットされます。つまり、作業項目がさらに 4 回失敗するまで、ジョブは自動的に一時停止されません。
pause-on-failure を有効にする
ジョブの失敗時に一時停止を有効にするには、ジョブの実行時に pause_on_failure Dataflow サービス オプションを使用します。
Java
--dataflowServiceOptions=pause_on_failure
Python
--dataflow_service_options=pause_on_failure
Go
--dataflow_service_options=pause_on_failure
最大一時停止時間を指定する
デフォルトでは、ジョブは最大 7 日間(7d)一時停止されます。この最大一時停止期間は、1 時間(1h)から 7 日間(7d)の間で手動で構成できます。
d(日)と h(時間)のみがサポートされています。1 日は 24 時間と定義されます。夏時間などの要因により、カレンダーの 1 日の長さと一致しない場合があります。
最大一時停止期間が経過すると、ジョブは 1 時間以内にキャンセルされます。ジョブをキャンセルすると、ジョブを再開できません。
たとえば、次の例では、一時停止の最大期間を 1 日に設定します。
Java
--dataflowServiceOptions=pause_on_failure=pause_duration:1d
Python
--dataflow_service_options=pause_on_failure=pause_duration:1d
Go
--dataflow_service_options=pause_on_failure=pause_duration:1d
Dataflow ジョブを手動で一時停止する
ジョブを手動で一時停止する手順は次のとおりです。
コンソール
Dataflow の [ジョブ] ページに移動します。
一時停止するジョブをクリックします。
ジョブを一時停止するには、ジョブのステータスが「実行中」でなければなりません。
ジョブの詳細ページで、[一時停止] をクリックします。
[一時停止] ボタンが表示されない場合、失敗時に一時停止する制限により、ジョブを一時停止できません。
gcloud
Dataflow ジョブを一時停止するには、Cloud Shell または gcloud CLI がインストールされたローカル ターミナルで gcloud dataflow
jobs コマンドを使用します。
シェルを開きます。
実行中の Dataflow ジョブのジョブ ID を一覧表示し、一時停止するジョブのジョブ ID をメモします。
gcloud dataflow jobs list--regionフラグを設定しない場合、使用可能なすべてのリージョンの Dataflow ジョブが表示されます。次のコマンドを実行します。
gcloud dataflow jobs pause JOB_ID --region=REGIONJOB_ID は記録したジョブ ID に、REGION はジョブのリージョンに置き換えます。
API
Dataflow REST API を使用してジョブを一時停止するには、projects.locations.jobs.update エンドポイントを使用し、次のリクエスト ボディを渡します。
{
"requestedState": "JOB_STATE_PAUSING"
}
重要: 誤って JOB_STATE_PAUSED を requestedState として渡さないでください。
一時停止中または一時停止した Dataflow ジョブをキャンセルする
一時停止中または一時停止した Dataflow ジョブは、通常どおりキャンセルできます。ジョブをキャンセルすると、そのジョブに対する課金は停止されますが、ジョブを再開することはできなくなります。
一時停止したジョブは、最大一時停止期間が経過すると自動的にキャンセルされます。
Dataflow ジョブを再開する
一時停止したジョブを手動で再開する手順は次のとおりです。
コンソール
Dataflow の [ジョブ] ページに移動します。
再開するジョブをクリックします。
ジョブを再開するには、ジョブのステータスが「一時停止」(「一時停止中」ではない)である必要があります。
ジョブの詳細ページで、[再開] をクリックします。
gcloud
Dataflow ジョブを再開するには、Cloud Shell または gcloud CLI がインストールされたローカル ターミナルで gcloud dataflow
jobs コマンドを使用します。
シェルを開きます。
一時停止中の Dataflow ジョブのジョブ ID を一覧表示し、再開するジョブのジョブ ID をメモします。
gcloud dataflow jobs list--regionフラグを設定しない場合、使用可能なすべてのリージョンの Dataflow ジョブが表示されます。次のコマンドを実行します。
gcloud dataflow jobs resume JOB_ID --region=REGIONJOB_ID はジョブ ID に、REGION はジョブ リージョンに置き換えます。
API
Dataflow REST API を使用してジョブを再開するには、projects.locations.jobs.update エンドポイントを使用し、次のリクエスト ボディを渡します。
{
"requestedState": "JOB_STATE_RUNNING"
}
次のステップ
- 実行中のパイプラインを停止する方法について学習する。
- この機能を使用するために必要な バッチジョブ用の Dataflow Shuffle を理解する。
- エラーを解決するには、パイプラインのトラブルシューティング ガイドをご覧ください。
- バッチジョブの処理速度が遅い場合や停止している場合のトラブルシューティングを行う方法を学習する。