「Error Code: 503 Slow Down」エラーが発生し、Amazon EMR で S3DistCp ジョブを実行できないため、解決したいです。
解決策
データが Apache Hive スタイルのパーティションを使用しており、Amazon Simple Storage Service (Amazon S3) のリクエストレートを超えた場合、次のエラーが発生します。
「mapreduce.Job: Task Id : attempt_######_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)」
たとえば、次の Amazon S3 パスは同じプレフィックス (/year=2019/) を使用しています。
- 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
リクエストクォータは、1 秒あたり 3,500 回の書き込みリクエストまたは 5,500 回の読み取りリクエストに設定されています。プレフィックス内のすべての操作がクォータにカウントされます。
パーティションの数を増やせない場合は、次のいずれかの方法で S3DistCp ジョブに対するスロットリングエラーを解決します。
Reduce タスクの数を減らす
mapreduce.job.reduces パラメータでは、ジョブでの Reduce タスクの数を設定します。Amazon EMR は、クラスター内のノード数とクラスターのメモリリソースに基づいて mapreduce.job.reduces を動的に設定します。
次のコマンドを実行し、クラスター内のジョブでのデフォルトの Reduce タスク数を確認します。
hdfs getconf -confKey mapreduce.job.reduces
mapreduce.job.reduces に新しい値を設定するには、次のコマンドを実行します。
s3-dist-cp -Dmapreduce.job.reduces=10 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
注: 10 は、Reduce タスクに設定する実際の数値に置き換えます。さらに、例の値を実際に使用する値に置き換えてください。
EMRFS 再試行クォータを増やす
デフォルトでは、EMRFS 再試行クォータは 4 に設定されています。
次のコマンドを実行し、クラスターでの再試行クォータを確認します。
hdfs getconf -confKey fs.s3.maxRetries
s3-dist-cp ジョブの再試行クォータを増やすには、次のコマンドを実行します。
s3-dist-cp -Dfs.s3.maxRetries=20 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
注: 20 は、再試行回数に設定するクォータに置き換えます。さらに、例の値を実際に使用する値に置き換えてください。
新しいクラスターでの再試行クォータを増やすには、クラスターの起動時に設定オブジェクトを追加します。実行中のクラスターでの再試行クォータを増やすには、設定オブジェクトを使用してインスタンスグループのクラスター設定をオーバーライドします。
Amazon EMR バージョン 5.21.0 以降用の設定オブジェクトの例
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
クラスターで再試行クォータを増やすと、Apache 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/")
関連情報
設計パターンのベストプラクティス: Amazon S3 のパフォーマンスを最適化する
Amazon EMR で Spark ジョブまたは Hive ジョブが失敗し、HTTP 503「Slow Down」AmazonS3Exception が発生する理由を知りたいです