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 開発者ガイド の「サーバー側の暗号化を使用したデータの保護」および「AWS KMS に保存された CMK によるサーバー側の暗号化を使用したデータの保護」を参照してください。

Redshift Spectrum が AWS KMS に対して行うリクエストの数を減らす最初のステップは、アクセスされるファイルの数を減らすことです。これを行うには、小さなファイルを大きなファイルにマージしてみてください。64 MB 以上のファイルサイズの使用が推奨されます。

Redshift Spectrum リクエストが AWS KMS によって頻繁にスロットリングされる場合は、暗号化操作の AWS KMS リクエストレートのクォータ増加をリクエストすることを検討してください。クォータの引き上げをリクエストするには、アマゾン ウェブ サービス全般のリファレンス の「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 で DDL Hive を使用する際の構文エラー

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」を参照してください。