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/")
関連情報
設計パターンのベストプラクティス: Amazon S3 のパフォーマンス最適化
Amazon EMR で Spark または Hive ジョブが HTTP 503「Slow Down」AmazonS3Exception で失敗するのはなぜですか?