如何解決 Athena 中的「HIVE_CANNOT_OPEN_SPLIT: Hive 分割開啟錯誤 s3://awsdoc-example-bucket/: 減速 (服務: Amazon S3;狀態碼: 503;錯誤代碼: 503 減速;」錯誤?
我的 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 儲存貯體移除刪除標記。您可以執行下列其中一項動作來移除刪除標記:
- **手動刪除刪除標記:**使用 ListObjectVersions API 列出 S3 儲存貯體中所有物件版本的中繼資料。從傳回的中繼資料中,尋找物件的 versionID,然後永久刪除刪除標記。
- **設定生命週期組態以刪除刪除標記:**您可以使用 S3 生命週期政策定義您想要 Amazon S3 在物件生命週期內採取的動作。
檢查其他應用程式是否使用相同的 S3 前置詞
使用 Amazon CloudWatch 5xxErrors 指標和 S3 伺服器存取日誌,以檢查其他應用程式 (例如 EMR 上的 Hive、Spark 或 AWS Glue) 是否在執行 Athena 查詢時使用相同的 S3 前置詞。嘗試從相同的 S3 前置詞讀取資料的多個應用程式可能會導致請求限流、查詢失敗並出現減速錯誤。避免排程同時存取相同前置詞的應用程式。此外,將不同的 S3 前置詞用於 Athena 資料來源和應用程式資料來源。
您可以為 S3 儲存貯體中的所有物件建立 CloudWatch 指標組態。使用這些指標在特定時間點監控特定前置詞的 API 呼叫率指標。啟用前置詞的 S3 請求指標有助於了解特定時間點前置詞的整體 API 命中率。您可以將此資訊與 S3 伺服器存取日誌一起使用,找出哪個應用程式正在將 API 呼叫用於前置詞。
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 9 個月前lg...
- 已提問 9 個月前lg...
- 已提問 1 年前lg...
- 已提問 9 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 個月前
- AWS 官方已更新 2 年前