如何解決 Amazon EMR 中 S3DistCp 作業上的「錯誤代碼:503 減速」錯誤?

1 分的閱讀內容
0

我想解決「錯誤代碼: 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 的訊息?

AWS 官方
AWS 官方已更新 2 個月前