為什麼我在 Amazon EMR 上的 Spark 或 Hive 工作失敗,並出現 HTTP 503 “Slow Down” AmazonS3Exception 的訊息?

2 分的閱讀內容
0

我在 Amazon EMR 上的 Apache Spark 或 Apache Hive 作業失敗,出現類似如下的 HTTP 503 "Slow Down" AmazonS3Exception:java.io.IOException: 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: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=

簡短描述

當應用程式的 Amazon Simple Storage Service (Amazon S3) 請求速率超過每秒 5,000 個請求的通常持續速率,並且 Amazon S3 在內部最佳化效能時,就會發生此錯誤。

若要在使用 Amazon EMR 存取 S3 資料時提高請求的成功率,請嘗試以下方法:

  • 修改 S3 請求的重試策略。
  • 調整並行 S3 請求的數量。

解決方法

為協助識別請求過多的問題,最佳做法是為 S3 儲存貯體設定 Amazon CloudWatch 請求指標。您可以根據這些 CloudWatch 指標確定最適合您的使用情況的解決方案。

設定 CloudWatch 請求指標

若要監控 Amazon S3 請求,請為儲存貯體開啟 CloudWatch 請求指標。然後,為前綴定義篩選條件。如需要監控的實用指標清單,請參閱使用 Amazon CloudWatch 監控指標

修改 S3 請求的重試策略

依預設,EMRFS 會使用指數退避策略重試向 Amazon S3 發出請求。預設 EMRFS 重試限制為 15。不過,您可以增加新叢集、執行中叢集或應用程式執行期的重試限制。

若要增加重試限制,請變更 fs.s3.maxRetries 參數的值。如果為此參數設定非常高的值,可能會遇到較長的工作持續時間。嘗試將此參數設定為高值 (例如 20)、監控工作的持續時間開銷,然後根據您的使用情況調整此參數。

對於新叢集,您可以在啟動叢集時新增組態物件,如下所示:

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

叢集啟動後,在 Amazon EMR 上執行的 Spark 和 Hive 應用程式會使用新的限制。

若要增加執行中叢集的重試限制,請執行下列動作:

1.    開啟 Amazon EMR 主控台

2.    在叢集清單中,在名稱下選擇您要重新設定的作用中叢集。

3.    開啟叢集的叢集詳細資訊頁面,然後選擇組態標籤。

4.    在篩選條件下拉清單中,選取您要重新設定的執行個體群組。

5.    在重新設定下拉清單中,選擇在表格中編輯

6.    在組態分類表中,選擇新增組態,然後輸入下列內容:

對於分類:emrfs-site

對於屬性:fs.s3.maxRetries

對於:重試限制的新值 (例如 20)

7.    選取將此設定套用至所有作用中執行個體群組

8.    選擇儲存變更

部署組態之後,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/")

以下是如何在 Hive 應用程式的執行期增加重試限制的範例:

hive> set fs.s3.maxRetries=20;
hive> select ....

調整並行 S3 請求的數量

  • 如果您有多個作業 (Spark、Apache Hive 或 s-dist-cp) 讀取和寫入相同的 S3 前綴,則可調整並行量。從讀取/寫入大量的作業開始,降低其並行量,以避免並行量過大。如果您為 Amazon S3 設定跨帳戶存取權,請記住,其他帳戶可能也會將作業提交至相同的前綴。
  • 如果您在作業嘗試寫入目標儲存貯體時看到錯誤,則減少過多的寫入平行處理。例如,在寫入 Amazon S3 之前,使用 Spark .coalesce().repartition() 操作來減少 Spark 輸出分割區的數量。您還可以減少每個執行者的內核數量或減少執行者的數量。
  • 如果您在作業嘗試從來源儲存貯體讀取時看到錯誤,則調整物件的大小。您可以將較小的物件彙總為較大的物件,以減少作業要讀取的物件數量。這樣可讓您的作業以較少的讀取請求讀取資料集。例如,使用 s3-dist-cp 將大量的小檔案合併為少量的大檔案。

相關資訊

最佳實務設計模式:最佳化 Amazon S3 效能

為什麼我的 Amazon EMR 應用程式失敗,並出現 HTTP 403「拒絕存取」AmazonS3Exception?

為什麼我的 Amazon EMR 應用程式失敗,並出現 HTTP 404「找不到」AmazonS3Exception?

AWS 官方
AWS 官方已更新 2 年前