Amazon Redshift Spectrum でのクエリのトラブルシューティング - Amazon Redshift

Amazon Redshift Spectrum でのクエリのトラブルシューティング

以下は、Amazon Redshift Spectrum クエリによく見られる問題を特定し、解決するための参考資料です。Redshift Spectrum クエリで生成されたエラーを表示するには、SVL_S3LOGシステムテーブルのクエリを実行します。

再試行数の超過

Amazon Redshift Spectrum リクエストがタイムアウトすると、リクエストはキャンセルされ再送信されます。再試行が 5 回失敗するとクエリは失敗し、次のエラーが表示されます。

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

次の 2 種類のスロットリングが発生します。

  • 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 にデータを保存する場合は、Redshift Spectrum がアクセスするファイルごとに、AWS KMSに対する API オペレーションを Amazon S3 が呼び出します。これらのリクエストは、暗号化操作のクォータにカウントされます。詳細については、「AWS KMS クォータのリクエスト」を参照してください。SSE-S3 および SSE-KMS の詳細については、Amazon Simple Storage Service ユーザーガイドの「サーバー側の暗号化を使用したデータの保護」および「Protecting Data Using Server-Side Encryption with KMS keys Stored in 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 リクエストがメモリ割り当てをオーバーランさせる原因としては、次の 2 つが考えられます。

  • 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 リソースにアクセスできるかどうかを確認します。詳細については、「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 は、Hive DDL と類似した CREATE EXTERNAL TABLE 用のデータ定義言語 (DDL) をサポートしています。ただし、2 つの DDL タイプは常に代替可能であるとは限りません。Hive DDL をコピーして Amazon Redshift 外部テーブルを作成または変更した場合、構文エラーが発生する可能性があります。以下に Amazon Redshift と Hive DDL の違いの例を示します。

  • Hive DDL がダブルクォーテーションマーク (") をサポートしているのに対して、Amazon Redshift はシングルクォーテーションマーク (') を使用します。

  • 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

このエラーを回避するには、Redshift Spectrum からクエリされている Amazon S3 ファイルに対しての上書きを防止します。

無効な Parquet バージョン番号

Redshift Spectrum は、アクセスする各 Apache Parquet ファイルのメタデータをチェックします。このチェックに失敗すると、次のようなエラーが発生することがあります。

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

チェックが失敗する原因としては、以下の 2 つが考えられます。

  • クエリ中に、対象の Parquet ファイルが上書きされた (無効な範囲 を参照)。

  • Parquet ファイルが破損している。