Amazon EMR の s3-dist-cp ジョブで「エラーコード :503 Slow Down」をトラブルシューティングする方法を教えてください。

最終更新日: 2020 年 2 月 10 日

Amazon EMR ジョブの S3DistCp (s3-dist-cp) ジョブが、Amazon Simple Storage Service (Amazon S3) のスロットリングが原因で失敗します。次のようなエラーメッセージが表示されます:

mapreduce.Job: Task Id : attempt_xxxxxx_0012_r_000203_0, Status : FAILED Error: 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: D27E827C847A8304; S3 Extended Request ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo=), S3 Extended Request ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo= at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712)

簡単な説明

「Slow Down」エラーは、Amazon S3 リクエストレート (バケット内のプレフィックスごとに 1 秒あたり 3,500 PUT/COPY/POST/DELETE および 5,500 GET/HEAD リクエスト) を超えた場合に発生します。これは、データが Apache Hive 形式のパーティションを使用している場合によく起こります。たとえば、次の Amazon S3 パスは同じプレフィックス (/year=2019/) を使用しています。つまり、リクエストの制限は、1 秒あたり 3,500 回の書き込みリクエストまたは 5,500 の読み取りリクエストです。

  • s3://awsexamplebucket/year=2019/month=11/day=01/mydata.parquet
  • s3://awsexamplebucket/year=2019/month=11/day=02/mydata.parquet
  • s3://awsexamplebucket/year=2019/month=11/day=03/mydata.parquet

パーティションの数を増やすことを選択できない場合は、リデューサータスクの数を減らすか、EMR ファイルシステム (EMRFS) の再試行制限を増やして Amazon S3 スロットリングエラーを解決します。

解決方法

次のオプションのいずれかを使用して、s3-dist-cp ジョブの調整エラーを解決します。

削減数を減らす

mapreduce.job.reduces パラメータは、ジョブの削減数を設定します。Amazon EMR は、クラスター内のノード数とクラスターのメモリリソースに基づいて mapreduce.job.reduces を自動的に設定します。次のコマンドを実行して、クラスター内のジョブのデフォルトの削減数を確認します。

$ hdfs getconf -confKey mapreduce.job.reduces

mapreduce.job.reduces に新しい値を設定するには、次のようなコマンドを実行します。このコマンドは、削減数を 10 に設定します。

$ s3-dist-cp -Dmapreduce.job.reduces=10 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/

EMRFS の再試行制限を引き上げる

デフォルトでは、EMRFS の再試行制限は 4 に設定されています。次のコマンドを実行して、クラスターの再試行制限を確認します。

$ hdfs getconf -confKey fs.s3.maxRetries

単一の s3-dist-cp ジョブの再試行制限を引き上げるには、次のようなコマンドを実行します。このコマンドは、再試行制限を 20 に設定します。

$ s3-dist-cp -Dfs.s3.maxRetries=20 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/

新規または実行中のクラスターの再試行制限を引き上げるには、次の手順を実行します。

  • 新しいクラスター: クラスターの起動時に次のような設定オブジェクトを追加します。
  • 実行中のクラスター: インスタンスグループ (Amazon EMR リリースバージョン 5.21.0 以降) のクラスター設定を上書きするには、次の設定オブジェクトを使用します。
[
    {
      "Classification": "emrfs-site",
      "Properties": {
        "fs.s3.maxRetries": "20"
      }
    }
]

クラスターの再試行制限を引き上げると、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/")