本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Redshift Spectrum 中的查詢疑難排解
本主題是您使用 Amazon Redshift Spectrum 查詢時可能遇到的常見問題的參考。
查詢 SVL_S3LOG 系統資料表以檢視由 Redshift Spectrum 查詢產生的錯誤。
主題
超過重試次數
如果 Amazon Redshift Spectrum 請求逾時,則該請求會被取消並重新提交。在五次重試失敗後,該查詢即失敗並顯示以下錯誤。
error: Spectrum Scan Error: Retries exceeded
可能的子句包括:
-
大型檔案 (大於 1 GB)。檢查 Amazon S3 中的檔案大小,尋找大型檔案和檔案大小扭曲。將大型檔案分成許多介於 100 MB 與 1 GB 的較小檔案。試著將檔案維持相同大小。
-
慢速網路傳輸量。請稍後嘗試您的查詢。
存取已限流
Amazon Redshift Spectrum 受其他服務的服務配額限制 AWS 。在高使用量下,Redshift Spectrum 請求可能需要減慢速度,因而導致以下錯誤。
error: Spectrum Scan Error: Access throttled
可能發生兩種類型的限流:
-
存取受到 Amazon S3 限流。
-
由 限流的存取 AWS KMS。
錯誤內容提供有關限流類型的詳細資料。您可以在下面找到此限流的原因和可能的解決方案。
存取受到 Amazon S3 限流
如果字首上的讀取請求率太高,Amazon S3 可能會限流 Redshift Spectrum 請求。如需您可以在 Amazon S3 中達到的 GET/HEAD 請求率資訊,請參閱 Amazon Simple Storage Service 使用者指南中的最佳化 Amazon S3 效能。 Amazon S3 GET/HEAD 請求速率會將字首上的所有 GET/HEAD 請求納入考量,讓存取相同字首的不同應用程式共用總請求速率。
如果您的 Redshift Spectrum 請求經常受到 Amazon S3 限流,請減少 Redshift Spectrum 對 Amazon S3 發出的 Amazon S3 GET/HEAD 請求數量。若要執行此動作,請嘗試將小型檔案合併成大型檔案。我們建議使用大於 64 MB 的檔案。
另外,請考慮分割 Redshift Spectrum 資料表,以從早期篩選中獲益,並減少 Amazon S3 中存取的檔案數量。如需詳細資訊,請參閱分割 Redshift Spectrum 外部資料表。
存取由 AWS KMS限流
如果您使用伺服器端加密 (SSE-S3 或 SSE-KMS) 將資料存放在 Amazon S3,Amazon S3 AWS KMS 會針對 Redshift Spectrum 存取的每個檔案呼叫 API操作。這些請求會計入您的密碼編譯操作配額;如需詳細資訊,請參閱 AWS KMS 請求配額。如需 SSE-S3 和 SSE- 的詳細資訊KMS,請參閱 Amazon Simple Storage Service 使用者指南中的使用伺服器端加密保護資料,以及使用存放於 中的KMS金鑰保護資料 AWS KMS。
減少 Redshift Spectrum 向 發出請求數量的第一步 AWS KMS 是減少存取的檔案數量。若要執行此動作,請嘗試將小型檔案合併成大型檔案。我們建議使用大於 64 MB 的檔案。
如果您的 Redshift Spectrum 請求經常受到 限制 AWS KMS,請考慮為您的密碼編譯操作 AWS KMS 請求率請求增加配額。若要申請提高限制,請參閱Amazon Web Services 一般參考中的 AWS 服務限制。
超過資源限制
Redshift Spectrum 會對請求可以使用的記憶體數量強加上限。需要更多記憶體的 Redshift Spectrum 請求失敗,導致下列錯誤。
error: Spectrum Scan Error: Resource limit exceeded
有兩個常見的原因可能會造成 Redshift Spectrum 請求超出其記憶體限額:
-
Redshift Spectrum 會處理大塊資料,這些資料不能以較小的區塊分割。
-
大型彙總步驟是由 Redshift Spectrum 處理。
建議您使用支援平行讀取的檔案格式,分割大小為 128 MB 或更少。如需支援的檔案格式和建立資料檔的一般指導方針,請參閱Amazon Redshift Spectrum 中查詢的資料檔案。使用不支援平行讀取的檔案格式或壓縮演算法時,建議您將檔案大小保持在 64 MB 與 128 MB 之間。
分割的資料表沒有傳回資料列
如果您的查詢沒有從分割的外部資料表傳回任何資料列,請檢查是否已為此外部資料表新增分割區。Redshift Spectrum 僅會掃描使用 ALTER TABLE … ADD PARTITION
明確新增之 Amazon S3 位置中的檔案。請查詢 SVV_EXTERNAL_PARTITIONS 畫面以尋找現有分割區。針對每個缺少的分割區執行 ALTER TABLE … ADD PARTITION
。
未授權的錯誤
確認叢集IAM的角色允許存取 Amazon S3 檔案物件。如果您的外部資料庫位於 Amazon Athena 上,請確認IAM角色允許存取 Athena 資源。如需詳細資訊,請參閱IAM Amazon Redshift Spectrum 的政策。
不相容的資料格式
對於單欄檔案格式 (如 Apache Parquet),該欄位類型已嵌入了資料。CREATE EXTERNAL TABLE 定義中的資料欄類型必須與資料檔案的資料欄類型相符。如果有不相符的部分,您將收到類似以下的錯誤訊息:
File 'https://s3bucket/location/file has an incompatible Parquet schema for column ‘s3://s3bucket/location.col1'. Column type: VARCHAR, Par
由於訊息長度限制,錯誤訊息可能會被截斷。若要獲取包含欄位名稱與欄位類型的完整錯誤訊息,請查詢 SVL_S3LOG 系統畫面。
下列範例查詢 SVL_S3LOG 上次完成的查詢。
select message from svl_s3log where query = pg_last_query_id() order by query,segment,slice;
以下是顯示完整錯誤訊息的結果範例。
message –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––- Spectrum Scan Error. File 'https://s3bucket/location/file has an incompatible Parquet schema for column ' s3bucket/location.col1'. Column type: VARCHAR, Parquet schema:\noptional int64 l_orderkey [i:0 d:1 r:0]\n
若要更正此錯誤,請修改外部資料表以符合 Parquet 檔案的欄位類型。
在 Amazon Redshift DDL中使用 Hive 時的語法錯誤
Amazon Redshift 支援CREATEEXTERNALTABLE類似 Hive 的資料定義語言 (DDL)DDL。不過,這兩種類型的 DDL 不一定完全相同。如果您複製 Hive DDL來建立或修改 Amazon Redshift 外部資料表,您可能會遇到語法錯誤。以下是 Amazon Redshift 和 Hive 之間的差異範例DDL:
-
Amazon Redshift 需要單一引號 ('),其中 Hive DDL支援雙引號 (")。
-
Amazon Redshift 不支援STRING資料類型。請改用 VARCHAR。
建立暫存資料表的許可
要執行 Redshift Spectrum 查詢,資料庫使用者必須具有在資料庫中建立臨時資料表的許可。下列範例可在資料庫 spectrumdb
上授予臨時許可至 spectrumusers
使用者群組。
grant temp on database spectrumdb to group spectrumusers;
如需詳細資訊,請參閱GRANT。
無效的範圍
Redshift Spectrum 預期 Amazon S3 中屬於外部資料表的檔案在查詢期間不會被覆寫。如果發生這種情況,可能會導致以下錯誤。
Error: HTTP response error code: 416 Message: InvalidRange The requested range is not satisfiable
為避免發生錯誤,請確定 Amazon S3 檔案在使用 Redshift Spectrum 查詢時不會覆寫這些檔案。
無效的 Parquet 版本編號
Redshift Spectrum 會檢查它存取的每個 Apache Parquet 檔案的中繼資料。若檢查失敗,可能會導致類似下列內容的錯誤:
File 'https://s3.region
.amazonaws.com/s3bucket/location/file has an invalid version number
導致檢查失敗的常見原因有兩個:
-
Parquet 檔案在查詢期間已被覆寫 (請參閱無效的範圍 )。
-
Parquet 檔案已損毀。