Amazon EMR で Spark ジョブまたは Hive ジョブが失敗し、HTTP 503 "Slow Down" AmazonS3Exception が発生する理由を知りたいです。

所要時間2分
0

Amazon EMR での Apache Spark または Apache Hive ジョブが失敗し、次のような HTTP 503 "Slow Down" AmazonS3Exception エラーが発生します。"java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Slow Down (Service: Amazon S3; Status Code: 503; Error Code: 503 Slow Down; Request ID: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE="

簡単な説明

このエラーは、アプリケーションに対する Amazon Simple Storage Service (Amazon S3) のリクエストレートが通常の持続レートである 1 秒あたり 5,000 リクエストを超えており、Amazon S3 が内部でパフォーマンスを最適化した場合に発生します。

Amazon EMR を使用して S3 データにアクセスするときのリクエストの成功率を高めるには、次の方法を試してください。

  • S3 リクエストの再試行方法を変更します。
  • 同時に実行する S3 リクエストの数を調整します。

解決策

リクエスト過多の問題を特定するには、S3 バケットに Amazon CloudWatch リクエストメトリクスを設定することがベストプラクティスです。これらの CloudWatch メトリクスに基づいて、ユースケースに最適なソリューションを判断します。

CloudWatch リクエストメトリクスを設定する

バケットで CloudWatch リクエストメトリクスを有効化し、Amazon S3 のリクエストを監視します。次に、プレフィックスにフィルターを定義します。監視に使用できるメトリクスのリストについては、「Amazon CloudWatch でメトリクスを監視する」を参照してください。

S3 リクエストの再試行方法を変更する

デフォルトでは、EMRFS は指数バックオフ戦略を使用して Amazon S3 へのリクエストを再試行します。EMRFS のデフォルトの再試行制限は 15 回ですが、新しいクラスター、実行中のクラスター、またはアプリケーションの実行時の再試行制限を増やすことができます。

再試行の制限を増やすには、fs.s3.maxRetries parameter パラメータの値を変更します。このパラメータに非常に高い値を設定すると、ジョブの所要時間が長くなる可能性があります。このパラメータを高い値 (20 など) に設定し、ジョブの継続時間のオーバーヘッドを監視した後に、ユースケースに基づいてこのパラメータを調整します。

新しいクラスターでは、クラスターの起動時に次のような構成オブジェクトを追加します。

[
  {
    "Classification": "emrfs-site",
    "Properties": {
      "fs.s3.maxRetries": "20"
    }
  }
]

クラスターが起動した後、Amazon EMR で実行されている Spark および Hive アプリケーションは新しい制限を使用します。

実行中のクラスターへの再試行制限を増やすには、次の手順を実行します。

1.Amazon EMR コンソールを開きます。

2.クラスターリストの [名前] で、再構成対象のアクティブなクラスターを選択します。

3.クラスターの [クラスター詳細] ページを開き、[設定] タブを選択します。

4.[フィルター] ドロップダウンリストで、再設定するインスタンスグループを選択します。

5.[再構成] のドロップダウンリストで [テーブルで編集] を選択します。

6.構成分類テーブルで [設定を追加] を選択し、次の内容を入力します。

[分類]: emrfs-site

[プロパティ]: ffs.s3.maxRetries

[値]: 再試行制限の新しい値 (20 など)

7.[この設定をすべてのアクティブなインスタンスグループに適用する] を選択します。

8.**[変更を保存]**を選択します。

構成のデプロイ後、Spark および Hive アプリケーションは新しい制限を使用します。

実行時の再試行制限を増やすには、次のように Spark シェルセッションを使用します。

spark> sc.hadoopConfiguration.set("fs.s3.maxRetries", "20")
spark> val source_df = spark.read.csv("s3://awsexamplebucket/data/")
spark> source_df.write.save("s3://awsexamplebucket2/output/")

Hive アプリケーションの実行時に再試行制限を増やす方法の例を次に示します。

hive> set fs.s3.maxRetries=20;
hive> select ....

同時に実行する S3 リクエストの数を調整する

  • 同じ S3 プレフィックスへの読み取りと書き込みを行う複数のジョブ (Spark、Apache Hive、または s-dist-cp) がある場合は、同時実行を調整します。読み取り/書き込みの負荷が最も高いジョブから始め、並列処理が過剰にならないように並行処理を下げます。Amazon S3 のクロスアカウントアクセスを設定した場合、他のアカウントも同じプレフィックスでジョブを送信する可能性があることに注意してください。
  • ジョブが宛先バケットに書き込もうとしたときにエラーが発生した場合は、過剰な書き込み並列処理を減らしてください。たとえば、Amazon S3 に書き込む前に、Spark の .coalesce() または .repartition() 操作を実行することで、Amazon S3 への書き込み前の Spark の書き込みパーティション数を減らすことができます。エグゼキューターあたりのコア数を減らすか、エグゼキューターの数を減らすことも有効です。
  • ジョブがソースバケットからの読み込みを試行してエラーが発生した場合は、オブジェクトのサイズを調整します。小さいオブジェクトを大きいオブジェクトに集約することで、ジョブが読み取るオブジェクトの数を減らすことができます。これにより、ジョブがデータセットを読み取る際の読み取りリクエストを削減できます。たとえば、s3-dist-cp を使用すると、多数の小さなファイルを少数の大きなファイルにマージできます。

関連情報

設計パターンのベストプラクティス: Amazon S3 のパフォーマンスを最適化する

Amazon EMR アプリケーションがエラーとなり、HTTP 403 "Access Denied" AmazonS3Exception が発生する理由を知りたいです

Amazon EMR アプリケーションがエラーとなり、HTTP 404 "Not Found" AmazonS3Exception が発生する理由を知りたいです

AWS公式
AWS公式更新しました 3年前
コメントはありません

関連するコンテンツ