如何進行 Amazon EMR 中 s3-dist-cp 工作上的「錯誤碼:503 降速」的疑難排解?

1 分的閱讀內容
0

由於 Amazon Simple Storage Service (Amazon S3) 限流的關係,我在 Amazon EMR 工作上的 S3DistCp (s3-dist-cp) 工作失敗。我收到類似於下列內容的錯誤訊息:mapreduce.Job: 任務 ID:attempt_xxxxxx_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= at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712)

簡短說明

您的 Amazon S3 請求率超過(儲存貯體中每個前綴每秒有 3,500 個 PUT/COPY/POST/DELETE 和 5,500 個 GET/HEAD 請求)時,即會出現「降速」錯誤訊息。您的資料使用 Apache Hive 樣式分區時,經常會發生這種情況。例如,下列 Amazon S3 路徑使用相同的前綴 (/year=2019/)。這表示每秒的請求限值為 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/

要在新的叢集或執行中的叢集增加重試限值:

[
    {
      "Classification": "emrfs-site",
      "Properties": {
        "fs.s3.maxRetries": "20"
      }
    }
]

您增加叢集的重試限值時,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 年前