

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# EMR Serverless 猶予期間を含むジョブ実行のキャンセル
<a name="job-cancellation-grace-period"></a>

データ処理システムでは、突然終了することにより、リソースの無駄、不完全なオペレーション、データの不整合が発生する可能性があります。Amazon EMR Serverless では、ジョブ実行をキャンセルする時に猶予期間を指定できます。この機能を使用することにより、ジョブが終了する前に、適切なクリーンアップと進行中の作業の完了にかかる時間を確保できます。

**注記**  
この機能は、Amazon EMR リリース 7.9.0 以降でサポートされています。

ジョブ実行のキャンセルする場合、パラメータ `shutdownGracePeriodInSeconds` を使用して猶予期間 (秒単位) を指定します。この間、ジョブは最終終了前にクリーンアップオペレーションを実行できます。動作とデフォルト設定は、バッチジョブとストリーミングジョブによって異なります。

## バッチジョブの猶予期間
<a name="grace-period-batch-jobs"></a>

バッチジョブの場合、EMR Serverless では、猶予期間中に実行されるカスタムクリーンアップオペレーションを実装できます。これらのクリーンアップオペレーションは、JVM シャットダウンフックの一部としてアプリケーションコードに登録できます。

**デフォルトの動作**

シャットダウンのデフォルトの動作は、猶予期間がないことです。その構成は以下の 2 つのアクションです:
+ 即時終了
+ リソースはすぐにリリースされます

**設定オプション**

正常なシャットダウンにつながる設定を指定できます:
+ シャットダウン猶予期間の有効な範囲: 15～1800 秒 (オプション)
+ 即時終了 (猶予期間なし): 0 秒

### 正常なシャットダウンを有効にする
<a name="enable-graceful-shutdown-batch"></a>

バッチジョブの正常なシャットダウンを実装するには、以下の手順に従います:

1. カスタムシャットダウンロジックを含むアプリケーションコードにシャットダウンフックを追加します。

------
#### [ Example in Scala ]

   ```
   import org.apache.hadoop.util.ShutdownHookManager
   
   // Register shutdown hook with priority (second argument)
   // Higher priority hooks run first
   ShutdownHookManager.get().addShutdownHook(() => {
       logger.info("Performing cleanup operations...")
   }, 100)
   ```

   [ShutdownHookManager](https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/api/org/apache/hadoop/util/ShutdownHookManager.html) の使用

------
#### [ Example in PySpark ]

   ```
   import atexit
   
   def cleanup():
       # Your cleanup logic here
       print("Performing cleanup operations...")
   
   # Register the cleanup function
   atexit.register(cleanup)
   ```

------

1. ジョブをキャンセルするときに猶予期間を指定して、以前に追加されたフックの実行に時間を確保します

   **例**

   ```
   # Default (immediate termination)
   aws emr-serverless cancel-job-run \
     --application-id {{APPLICATION_ID}} \
     --job-run-id {{JOB_RUN_ID}}
   
   # With 5-minute grace period
   aws emr-serverless cancel-job-run \
     --application-id {{APPLICATION_ID}} \
     --job-run-id {{JOB_RUN_ID}} \
     --shutdown-grace-period-in-seconds 300
   ```

## ストリーミングジョブの猶予期間
<a name="grace-period-streaming-jobs"></a>

Spark 構造化ストリーミングでは、計算で外部データソースとの間で読み取りまたは書き込みが行われるため、突然シャットダウンすると望ましくない結果が生じる可能性があります。ストリーミングジョブはマイクロバッチでデータを処理し、これらのオペレーションを途中で中断することにより、その後の試行で処理が重複する可能性があります。これは、前のマイクロバッチの最新チェックポイントが書き込まれなかった場合に発生し、ストリーミングジョブの再起動時に同じデータが再度処理されます。このような重複処理はコンピューティングリソースを浪費するだけでなく、ビジネスオペレーションにも影響するため、突然のシャットダウンを避けることが重要です。

EMR Serverless は、ストリーミングクエリリスナーによる正常なシャットダウンを組み込みでサポートします。これにより、ジョブの終了前に継続的なマイクロバッチが適切に完了します。このサービスは、ストリーミングアプリケーションのマイクロバッチ間の正常なシャットダウンを自動的に管理し、現在のマイクロバッチが処理を完了し、チェックポイントが適切に書き込まれ、シャットダウンプロセス中に新しいデータを取り込まずにストリーミングコンテキストがクリーンに終了されるようにします。

**デフォルトの動作**
+ デフォルトで有効になっている 120 秒の猶予期間。
+ 組み込みのストリーミングクエリリスナーは、正常なシャットダウンを管理します。

**設定オプション**
+ シャットダウン猶予期間の有効な範囲: 15～1800 秒 (オプション)
+ 即時終了: 0 秒

### 正常なシャットダウンを有効にする
<a name="enable-graceful-shutdown-streaming"></a>

ストリーミングジョブに正常なシャットダウンを実装するには:

ジョブをキャンセルする時に猶予期間を指定して、進行中のマイクロバッチが完了するまでの時間を確保します。

**例**

```
# Default graceful shutdown (120 seconds)
aws emr-serverless cancel-job-run \
  --application-id {{APPLICATION_ID}} \
  --job-run-id {{JOB_RUN_ID}}

# Custom grace period (e.g. 300 seconds)
aws emr-serverless cancel-job-run \
  --application-id {{APPLICATION_ID}} \
  --job-run-id {{JOB_RUN_ID}} \
  --shutdown-grace-period-in-seconds 300

# Immediate Termination
aws emr-serverless cancel-job-run \
  --application-id {{APPLICATION_ID}} \
  --job-run-id {{JOB_RUN_ID}} \
  --shutdown-grace-period-in-seconds 0
```

### カスタムシャットダウンフックを追加する (オプション)
<a name="custom-shutdown-hooks"></a>

EMR Serverless は、組み込みのストリーミングクエリリスナーを通じてデフォルトで正常なシャットダウンを管理しますが、オプションで個々のストリーミングクエリにカスタムシャットダウンロジックを実装できます。EMR Serverless は、正常なシャットダウンリスナーを優先度 60 (ShutdownHookManager を使用) で登録します。優先度の高いフックが最初に実行されるため、カスタムクリーンアップオペレーションを 60 を超える優先度で登録して、EMR Serverless のシャットダウンプロセスが開始される前に実行されるようにすることができます。

カスタムフックを追加するには、アプリケーションコードにシャットダウンフックを追加する方法を示すこのトピックの最初の例を参照してください。ここで、優先度は 100 で、60 を超えています。したがって、このようなシャットダウンフックが最初に実行されます。

**注記**  
カスタムシャットダウンフックはオプションであり、EMR Serverless によって自動的に処理される正常なシャットダウン機能には不要です。

### 猶予期間の料金とバッチ期間
<a name="grace-period-charges"></a>

猶予期間 (120 秒) のデフォルト値を使用する場合:
+ バッチ期間が 120 秒未満の場合は、バッチの完了に必要な実際の時間に対してのみ課金されます。
+ バッチ期間が 120 秒を超える場合、最大猶予期間 (120 秒) に対して課金されますが、クエリは強制終了されるため、正常にシャットダウンされない場合があります。

コストを最適化し、正常なシャットダウンを確保するには:
+ バッチ期間 > 120 秒の場合: バッチ期間に合わせて猶予期間を増やすことを検討してください
+ バッチ期間 < 120 秒の場合: 実際の処理時間に対してのみ課金されるため、猶予期間を調整する必要はありません

## 考慮事項
<a name="considerations"></a>

### 猶予期間の動作
<a name="grace-period-behavior"></a>
+ 猶予期間は、登録されたシャットダウンフックが完了するまでの時間を提供します。
+ ジョブは、猶予期間よりかなり前であっても、シャットダウンフックが終了するとすぐに終了します。
+ クリーンアップ操作が猶予期間を超えると、ジョブは強制的に終了します。

### サービスの動作
<a name="service-behavior"></a>
+ 猶予期間のシャットダウンは、RUNNING 状態のジョブでのみ使用できます。
+ CANCELLING 状態の後続のキャンセルリクエストは無視されます。
+ 内部サービスエラーが原因で EMR Serverless が猶予期間シャットダウンの開始に失敗した場合:
  + サービスは最大 2 分間再試行します。
  + 再試行が失敗することにより、ジョブは強制的に終了します。

### 料金
<a name="billing"></a>

ジョブは、猶予期間中にかかった時間を含め、ジョブが完全にシャットダウンするまで使用されたコンピューティングリソースに対して請求されます。