跳至內容

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

2 分的閱讀內容
0

我在 Amazon EMR 上的 Spark 或 Apache Hive 作業失敗,並出現 HTTP 503「Slow Down」AmazonS3Exception 的訊息。

簡短描述

當您的應用程式對 Amazon Simple Storage Service (Amazon S3) 的請求速率超過一般可持續的速率,且 Amazon S3 在內部進行效能最佳化時,您會收到以下錯誤:

「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=」

解決方法

設定 CloudWatch 請求指標

若要識別請求過多的問題,最佳實務是為 Amazon S3 儲存貯體設定 Amazon CloudWatch 請求指標

為儲存貯體啟用 CloudWatch 請求指標,並為首碼定義篩選器

修改 Amazon S3 請求的重試策略

預設情況下,EMR File System (EMRFS) 使用指數退避策略來重試對 Amazon S3 的請求。EMRFS 的預設重試上限為 15。不過,您可以增加新叢集、執行中叢集或應用程式執行期的重試限制。

若要提高重試上限,請變更 fs.s3.maxRetries 參數的值。

**注意:**若您為此參數設定過高的值,可能會導致作業執行時間變長。

將此參數設為較高的值,例如 20,並監控作業的執行時間負荷。然後根據您的使用案例調整該參數。

對於新叢集,您可以在啟動叢集時新增類似以下的組態物件

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

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

若要在執行中的叢集上提高重試上限,請完成以下步驟:

  1. 開啟 Amazon EMR console (Amazon EMR 主控台)。
  2. 選擇您要重新設定的作用中叢集。
  3. 選擇 Configurations (組態) 索引標籤。
  4. Filter (篩選器) 下拉式清單中,選取您要重新設定的執行個體群組。
  5. Reconfigure (重新設定) 下拉式清單中,選擇 Edit in table (在資料表中編輯)。
  6. 在組態分類資料表中,選擇 Add configuration (新增組態),然後使用以下值:
    對於 Classification (分類),請使用 emrfs-site
    對於 Property (屬性),請使用 fs.s3.maxRetries
    對於 Value (值),請輸入重試上限的新值。例如 20。
  7. 選取 Apply this configuration to all active instance groups (將此組態套用至所有作用中執行個體群組)。
  8. 選擇 Save changes (儲存變更)。

部署組態後,Spark 與 Hive 應用程式將使用新的上限。

若要在 Spark 應用程式執行期間提高重試上限,請使用 Spark Shell 工作階段來修改 fs.s3.maxRetries 參數,如下範例所示:

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 ....

調整同時進行的 Amazon S3 請求數量

  • 若您有多個作業 (Spark、Apache Hive 或 s-dist-cp) 同時讀取與寫入相同的 Amazon S3 首碼,您可以調整並行度。請從讀取或寫入最頻繁的作業開始,降低其並行度以避免過度平行化。
    **注意:**若您為 Amazon S3 設定了跨帳戶存取,其他 AWS 帳戶也可能提交作業至相同的首碼。
  • 若在作業嘗試寫入目的地儲存貯體時發生錯誤,請降低過多的寫入平行度。例如,使用 Spark 的 .coalesce().repartition() 操作,在寫入 Amazon S3 之前減少 Spark 輸出分區數量。您也可以減少每個執行器的核心數,或減少執行器數量。
  • 若在作業嘗試從來源儲存貯體讀取時發生錯誤,請調整物件大小。為了減少作業所讀取的物件數量,請將較小的物件彙整成較大的物件。例如,使用 s3-dist-cp 將大量的小檔案合併為少量的大檔案。

相關資訊

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

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

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

AWS 官方已更新 1 個月前