Amazon Redshift でクエリがキャンセルされたのはなぜですか?

所要時間2分
0

Amazon Redshift でのクエリがキャンセルされ、エラーメッセージが表示されました。

簡単な説明

Amazon Redshift でクエリがキャンセルされる理由は次のとおりです。

  • Amazon Redshift ワークロード管理 (WLM) クエリモニタリングルールのセットアップ
  • ステートメントのタイムアウト値
  • ABORT、CANCEL、または TERMINATE リクエスト
  • ネットワークに関する問題
  • クラスターメンテナンスのアップグレード
  • 内部処理エラー
  • ASSERT エラー

クエリが停止しないようにするには、次の手順を実行してください。

  • タイムアウトパラメータを増やしてください。
  • WLM QMR ルールを更新してください。
  • 長時間実行されるオペレーションをメンテナンス時間外にスケジュールしてください。

解決策

Amazon Redshift WLM クエリモニタリングルールのセットアップ

WLM クエリモニタリングルール (QMR) を作成して、キューのパフォーマンス境界をメトリクスに基づいて定義します。または、クエリが WLM の時間制限を超えたときに Amazon Redshift が実行するアクションを指定してください。たとえば、60 秒のしきい値を超えて実行されるクエリをキャンセルするルールを作成します。

例 1: クエリモニタリングルールで指定された中止アクション

クエリ監視ルールで指定された中止アクションが原因でクエリがキャンセルされた場合、クエリは次のエラーを返します。

"ERROR: Query (500029) cancelled by WLM abort action of Query Monitoring Rule "testrule"."

「中止」アクションが原因でクエリがキャンセルされたかどうかを確認するには、次のクエリを実行します。

select * from STL_WLM_RULE_ACTION where action = 'abort';

クエリ出力には、「中止」アクションによってキャンセルされたすべてのクエリが一覧表示されます。クエリ ID が出力に表示されている場合は、WLM QMR パラメータの制限時間を増やしてください。

**例 2: クエリをホップできるキューがありません **

クエリモニタリングルールで「ホップ」アクションが指定されている場合、クエリをホップできます。クエリがホップされると、WLM は WLM キュー割り当てルールに基づいてクエリを次に一致するキューにルーティングしようとします。クエリがキュー定義と一致しない場合、クエリはキャンセルされます。キャンセルされたクエリはデフォルトキューに再割り当てされません。詳細については、「wlm_json_configuration パラメーターのプロパティ」を参照してください。

**注:**手動の WLM 設定でのみクエリをホップできます。

クエリがホップされたのに一致するキューがない場合、キャンセルされたクエリは次のエラーメッセージを返します。

"ERROR: Query (500104) canceled on user's request and ran out of wlm queues for restart."

このエラーメッセージが表示されてクエリがキャンセルされた場合は、次のクエリを実行してユーザー定義キューを確認します。

select * from stl_wlm_query where query=<query-id>;

出力では、service_class エントリ 6 ~ 13 にはユーザー定義のキューが含まれています。たとえば、service_class 6 は WLM 構成で Queue1 を表示し、service_class 7 は Queue2 を表示する場合があります。

service_class とキューのマッピングの詳細については、次のクエリを実行してください。

select * from stv_wlm_service_class_config where service_class>5;

キューマッピング情報を取得したら、Amazon Redshift コンソール から WLM 設定を確認します。キューが WLM 設定と一致していることを確認します。クエリをホップできるのは、ユーザーグループまたはクエリグループ構成に対応するキューがある場合のみです。詳細については、「WLM クエリキューホッピング」を参照してください。

ステートメントのタイムアウト値

statement_timeout 値は、Amazon Redshift がクエリを終了する前にクエリが実行される最大時間です。ステートメントのタイムアウトを超えると、セッション中に送信されたクエリはキャンセルされ、次のエラーメッセージが表示されます。

「エラー: クエリ (150) はユーザーのリクエストによりキャンセルされました」

ステートメントのタイムアウトが原因でクエリがキャンセルされたかどうかを確認するには、次のクエリを実行します。

select * from SVL_STATEMENTTEXT where text ilike '%set%statement_timeout%to%' and pid in (select pid from STL_QUERY where query = <queryid>);

ステートメントのタイムアウトは、クラスターパラメータグループで設定することもできます。クラスターパラメータグループと任意のstatement_timeout 設定をチェックして、さらに確認してください。詳細については、「パラメータグループの変更」を参照してください。

ABORT、CANCEL、または TERMINATE リクエスト

特定のクエリがユーザー (スーパーユーザーなど) によって停止またはキャンセルされたかどうかを確認するには、クエリ ID を使用して次のクエリを実行します。

select * from SVL_STATEMENTTEXT where text ilike '%cancel%' and xid
    in (select xid from STL_QUERY where query = <queryid>);
select * from SVL_STATEMENTTEXT where text ilike '%abort%' and xid in (select xid from STL_QUERY where query = <queryid>);

クエリが出力に表示されている場合、クエリはユーザーのリクエストにより停止またはキャンセルされたことになります。

**注:**ユーザーは自分のセッションのみを終了できます。スーパーユーザーはすべてのセッションを終了できます。

ユーザーが対応するプロセス(クエリが実行されている)をキャンセルまたは終了したときに、クエリを停止することもできます。クエリをキャンセルまたは終了できるプロセスの例を以下に示します。

これらのコマンドによってプロセスがキャンセルまたは終了すると、エントリが SVL_TERMINATE に記録されます。セッションが終了したためにクエリが停止したかどうかを確認するには、SVL_TERMINATE ログを確認します。次のクエリを実行して SVL_TERMINATE ログを確認します。

select * from SVL_TERMINATE where pid=(select pid from STL_QUERY where query=500534);

ネットワークに関する問題

根本的なネットワークの問題が原因で、クエリがキャンセルされることがあります。ネットワークの問題が原因でクエリがキャンセルされたかどうかを確認するには、次のクエリを実行して STL_CONNECTION_LOG エントリを確認します。

select * from STL_CONNECTION_LOG where pid in (select pid from STL_QUERY where query = <query_id>);

STL_CONNECTION_LOG には、認証の試行とネットワーク接続または切断が記録されます。クエリが出力に表示される場合は、ネットワーク接続の問題が原因でクエリがキャンセルされた可能性があります。

クラスターメンテナンスのアップグレード

クエリの実行中に定期メンテナンスが行われると、クエリは終了してロールバックされ、クラスターの再起動が必要になります。長時間実行される操作 (大量のデータロードや VACUUM 操作など) は、メンテナンスウィンドウを避けてスケジュールしてください。詳細については、「メンテナンスウィンドウを避けてスケジュールする」を参照してください。

Amazon Redshift クラスターでメンテナンスが行われたかどうかを確認するには、Amazon Redshift コンソールの [イベント] タブを選択します。

内部処理エラー

STL_ERROR テーブルには、Amazon Redshift によって生成された内部処理エラーが記録されます。STL_ERROR テーブルには SQL エラーやメッセージは記録されません。

クエリが内部エラーによってキャンセルされたかどうかを確認するには、次のクエリを実行して ** STL_ERROR** エントリを確認します。

select * from STL_ERROR where userid=<user id>;

ASSERT エラー

ASSERT エラーが原因でクエリが停止することがあります。ASSERT エラーは、クエリ自体に問題がある場合に発生する可能性があります。パッチのアップグレード後に ASSERT エラーが発生した場合は、Amazon Redshift を最新のクラスターバージョンに更新してください。次に、クラスターのバージョン履歴を確認します。または、クラスターバージョンをロールバックすることもできます。

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ