在 Amazon Redshift Spectrum 中對疑難解答 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 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 頻譜請求,如果字首太高。如需在 Amazon S3 中實現的 GET/HEAD 請求速率的相關資訊,請參閲最佳化 Amazon S3 效能Amazon Storage Service 用户指南。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 頻譜訪問的每個文件。這些請求會計入您的密碼編譯操作配額;如需詳細資訊,請參閱 AWS KMS 請求配額。如需 SSE-S3 與 SSE-KMS 的詳細資訊,請參使用伺服器端加密保護資料使用伺服器端加密來保護資料AWS KMSAmazon Storage Service 用户指南。

減少 Redshift Spectrum 發出的請求數量的第一個步驟AWS KMS是為了減少存取的檔案數目。若要執行此動作,請嘗試將小型檔案合併成大型檔案。我們建議使用大於 64 MB 的檔案。

如果您的 Redshift 頻譜請求經常受到AWS KMS,請考慮為您的AWS KMS密碼編譯操作的請求速率。若要請求增加配額,請參AWS服務限制中的Amazon Web Services 一般參考

超過資源限制

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。請查詢 SVV_EXTERNAL_PARTITIONS 畫面以尋找現有分割區。針對每個缺少的分割區執行 ALTER TABLE … ADD PARTITION

未授權的錯誤

請確認叢集的 IAM 角色是否允許存取 Amazon S3 檔案對象。如果您的外部資料庫位於 Amazon Athena 上,請確認 IAM 角色是否允許存取 Athena 資源。如需詳細資訊,請參閱 Amazon Redshift Spectrum 的 IAM 政策

不相容的資料格式

對於單欄檔案格式 (如 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 中使用 Hive DDL 時的語法錯誤

Amazon Redshift 支援 CREATE EXTERNATE EXTERNATE TABLE 的資料定義語言 (DDDDDL),類似於 Hive DDDDL 但是,這兩種類型的 DDL 有時並不完全相同。如果您複製了 Hive DDDDL 以建立或更改 Amazon Redshift 外部資料表,則可能會遇到語法錯誤。以下是 Amazon Redshift 與 Hive DDL 之間的差異範例:

  • Amazon Redshift 需要單引號 ('),而 Hive DDDDDL 則支援雙引號 (「)。

  • Amazon Redshift 不支援 STRING 資料類型。請改用 VARCHAR。

建立暫存資料表的許可

要執行 Redshift Spectrum 查詢,資料庫使用者必須具有在資料庫中建立臨時資料表的許可。下列範例可在資料庫 spectrumdb 上授予臨時許可至 spectrumusers 使用者群組。

grant temp on database spectrumdb to group spectrumusers;

如需詳細資訊,請參閱 GRANT

無效範圍

Redshift 頻譜期望 Amazon S3 中屬於外部表的文件在查詢過程中不會被覆蓋。如果發生這種情況,可能會導致以下錯誤。

Error: HTTP response error code: 416 Message: InvalidRange The requested range is not satisfiable

為避免出現錯誤,請確保 Amazon S3 文件在使用 Redshift 頻譜查詢時不會被覆蓋。

無效的拼花版本號

Redshift 頻譜會檢查它訪問的每個 Apache 實木複合文件的元數據。如果檢查失敗,則可能會導致類似下列內容的錯誤:

File 'https://s3.region.amazonaws.com/s3bucket/location/file has an invalid version number

有兩種常見的原因可能會導致檢查失敗:

  • 在查詢過程中已覆蓋實木複製文件(請參閲無效範圍

  • 實木複合文件已損壞。