如何解決 Athena 中的「HIVE_CANNOT_OPEN_SPLIT: Hive 分割開啟錯誤 s3://awsdoc-example-bucket/: 減速 (服務: Amazon S3;狀態碼: 503;錯誤代碼: 503 減速;」錯誤?

2 分的閱讀內容
0

我的 Amazon Athena 查詢失敗,出現以下錯誤之一: 「HIVE_CANNOT_OPEN_SPLIT: Hive 分割開啟錯誤 s3://awsdoc-example-bucket/date=2020-05-29/ingest_date=2020-04-25/part-00000.snappy.parquet (offset=0, length=18614): 減速 (服務: Amazon S3;狀態碼: 503;錯誤代碼: 503 減速;」 -或- 「不明失敗 (狀態碼 = 1003, java.sql.SQLException: [Simba]AthenaJDBC 一個錯誤從以下目的地傳送出來:AWS Athena client.HIVE_CANNOT_OPEN_SPLIT: Hive 分割開啟錯誤 s3://awsdoc-example-bucket/date=2020-05-29/ingest_date=2020-04-25/part-00000.snappy.parquet (offset=0, length=18614): 減速 (服務: Amazon S3;狀態碼: 503;錯誤代碼: 503 減速;」

簡短說明

Amazon Simple Storage Service (Amazon S3) 儲存貯體每秒每個前置詞可處理3,500 個 PUT/COPY/POST/DELETE 或 5,500 個 GET/HEAD 請求。當超過此請求閾值時,就會發生這些錯誤。此限制是帳戶所有使用者與服務的合併限制。

根據預設,Amazon S3 會自動擴展以支援非常高的請求速率。當您的請求速率擴展時,S3 儲存貯體會自動分割以支援更高的請求速率。不過,如果超過請求閾值,您就會收到 5xx 錯誤訊息,要求您減速或稍後再試。

例如,前置詞 s3://my-athena-bucket/month=jan/ 每秒僅支援 3,500 個 PUT/COPY/POST/DELETE,或每秒僅支援 5,500 個 GET/HEAD 請求。如果您在此前置詞中有 10,000 個檔案,且在此前置詞上執行 Athena 查詢,則會收到 503 減速錯誤。這是因為 Athena 嘗試使用 GET/HEAD 請求同時讀取前置詞上的所有 10,000 個檔案,但前置詞每秒最多只能支援 5,500 個 GET/HEAD 請求。這可能會導致 S3 請求限流,並導致 503 減速錯誤。

解決方案

請使用下列一或多個方法來防止請求限流:

在多個前置詞之間分配 S3 物件和請求

將資料分割有助於在多個前置詞之間分配物件和請求。避免在單一 S3 前置詞下儲存多個檔案。請考慮使用多個前置詞,以便在這些前置詞之間分配 S3 物件。將資料進行分割後,即可減少每次查詢時掃描的資料量。如需詳細資訊,請參閱分割資料

例如,不要將所有檔案儲存在 s3://my-athena-bucket/my-athena-data-files 下方,而是要將資料分割並儲存在以下個別前置詞下方:

s3://my-athena-bucket/jan

s3://my-athena-bucket/feb

s3://my-athena-bucket/mar

這些檔案中的資料可以進一步分割,以增加物件的分配 (範例: s3://my-athena-bucket/jan/01)。

如需決定 Athena 分割區資料夾結構的詳細資訊,請參閱 Amazon S3 效能訣竅和秘訣

減少每個前置詞中的檔案數

當您查詢包含大量小型物件的 S3 儲存貯體時,則可能會收到此錯誤。例如,如果 S3 儲存貯體中有一個 100 MB 檔案,則 Athena 必須提出 1 個 GET 請求才能讀取檔案。然而,如果有 1,000 個檔案,每個檔案都是 100 KB,則 Athena 必須提出 1,000 個 GET 請求,才能讀取相同的 100 MB 資料。這會導致請求超過 S3 請求限制。

若要減少 Amazon S3 請求數量,請減少檔案數量。例如,使用 S3DistCp 工具將大量的小型檔案 (小於 128 MB) 合併為數量較少的大型檔案。如需詳細資訊,請參閱 Amazon Athena 的 10 大效能調校訣竅,並檢視 4。優化檔案大小區段。

範例:

s3-dist-cp --src=s3://my_athena_bucket_source/smallfiles/ --dest=s3://my_athena_bucket_target/largefiles/ --groupBy='.*(.csv)'

請務必在上述命令中替換以下內容:

  • 將 my_athena_bucket_source 替換為小型檔案所在的來源 S3 儲存貯體。
  • 將 my_athena_bucket_target 替換為儲存輸出的目標 S3 儲存貯體。

您可以使用 groupBy 選項,將小型檔案彙總成數量較少但容量較大的檔案,具體大小由您選擇。如此有助於您優化查詢效能和成本。

注意: S3DistCp 不支援 Parquet 檔案的串連。請改用 PySpark。如需詳細資訊,請參閱如何在 Amazon EMR 中串連 Parquet 檔案?

檢查 S3 儲存貯體是否已啟用版本控制

當您從啟用版本功能的儲存貯體刪除物件時,Amazon S3 會插入刪除標記,而不是永久移除物件。如果您的 S3 儲存貯體中有許多帶有刪除標記的檔案,則可能會收到此錯誤。當您在啟用版本功能的儲存貯體上執行查詢時,Athena 必須檢查每個物件的不同版本。然後,Athena 判斷是否要在查詢處理期間包含特定物件。

若要解決此錯誤,請考慮從 S3 儲存貯體移除刪除標記。您可以執行下列其中一項動作來移除刪除標記:

檢查其他應用程式是否使用相同的 S3 前置詞

使用 Amazon CloudWatch 5xxErrors 指標S3 伺服器存取日誌,以檢查其他應用程式 (例如 EMR 上的 Hive、Spark 或 AWS Glue) 是否在執行 Athena 查詢時使用相同的 S3 前置詞。嘗試從相同的 S3 前置詞讀取資料的多個應用程式可能會導致請求限流、查詢失敗並出現減速錯誤。避免排程同時存取相同前置詞的應用程式。此外,將不同的 S3 前置詞用於 Athena 資料來源和應用程式資料來源。

您可以為 S3 儲存貯體中的所有物件建立 CloudWatch 指標組態。使用這些指標在特定時間點監控特定前置詞的 API 呼叫率指標。啟用前置詞的 S3 請求指標有助於了解特定時間點前置詞的整體 API 命中率。您可以將此資訊與 S3 伺服器存取日誌一起使用,找出哪個應用程式正在將 API 呼叫用於前置詞。


相關資訊

如何提高 Amazon S3 請求限制,以免 Amazon S3 儲存貯體限流?

Athena 疑難排解

Athena 效能調校

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