我想解決「錯誤代碼: 503 減速」錯誤,該錯誤導致我的 S3DistCP 作業在 Amazon EMR 中失敗。
解決方法
當您的資料使用 Apache Hive 樣式分區,並且您超過 Amazon Simple Storage Service (Amazon S3) 請求率時,您會收到以下錯誤:
「mapreduce.Job: 任務 ID:attempt_######_0012_r_000203_0,狀態: 失敗錯誤:com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: 減速 (服務: Amazon S3;狀態碼: 503;錯誤代碼: 503 降速;請求 ID: D27E827C847A8304;S3 延伸請求 ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo=),S3 擴充請求 ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo= 在 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
請求配額為每秒 3,500 個寫入請求或 5,500 個讀取請求。首碼內的所有作業均計入配額。
如果您無法增加分區數量,請使用下列其中一個選項來解決 S3DistCp 作業上的限流錯誤。
減少降減任務數量
mapreduce.job.reduces 參數設定該作業的降減任務數量。Amazon EMR 會根據叢集中的節點數量和叢集的記憶體資源,自動設定 mapreduce.job.reduces。
執行下列命令來檢查叢集中作業的預設降減任務數量:
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 替換為您要為降減任務設定的數字。另外,將範例值替換為您的值。
增加 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 Shell 工作階段範例使用較高的重試配額:
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「降速」 AmazonS3Exception 的訊息?