ワークロード管理の設定 - Amazon Redshift

ワークロード管理の設定

Amazon Redshift では、ワークロード管理 (WLM) を使用して、使用可能なクエリキューの数と、処理するためにクエリをそれらのキューにルーティングする方法を定義します。WLM は、パラメータグループ設定の一部です。クラスターは、関連付けられているパラメータグループで指定された WLM 設定を使用します。

パラメータグループを作成すると、デフォルトの WLM 設定には、最大 5 つのクエリを同時に実行できる 1 つのキューが含まれます。クエリの処理をさらに細かく制御する場合、キューを追加して、各キューの WLM プロパティを設定できます。追加した各キューのデフォルトの WLM 設定は、そのプロパティを設定するまで同じです。

付加的なキューを追加する場合、設定内の最後のキューがデフォルトキューになります。クエリが WLM 設定の条件に基づいて別のキューにルーティングされる場合を除いて、デフォルトキューにより処理されます。デフォルトキューのモードおよび同時実行レベル (クエリスロット) を指定できますが、デフォルトキューのユーザーグループやクエリグループを指定することはできません。

他のパラメータと同様、デフォルトパラメータグループで WLM 設定を変更することはできません。デフォルトパラメータグループに関連付けられたクラスターは、常にデフォルトの WLM 設定を使用します。WLM 設定を変更するには、新しいパラメータグループを作成してからカスタム WLM 設定を必要とするクラスターとそのパラメータグループを関連付けます。

WLM の動的プロパティと静的プロパティ

WLM 設定プロパティは動的または静的のいずれかです。動的なプロパティは、クラスターを再起動することなくデータベースに適用できますが、静的プロパティで変更を有効にするには、クラスターの再起動が必要です。静的および動的プロパティの詳細については、「WLM の動的設定プロパティと静的設定プロパティ」を参照してください。

wlm_json_configuration パラメータのプロパティ

WLM は、Amazon Redshift console、AWS CLI、Amazon Redshift API、またはいずれかの AWS SDK を使用して設定できます。WLM 設定では、キュー間でのメモリ割り当て、キューで同時に実行できるクエリの数などのキューの動作を定義するいくつかのプロパティが使用されます。

注記

以下のプロパティは Amazon Redshift console 名とともに表示され、対応する JSON プロパティは説明で示されています。

次の表は、プロパティが自動 WLM または手動 WLM に適用可能かどうかをまとめたものです。

WLM プロパティ 自動 WLM 手動 WLM
自動 WLM はい はい
ショートクエリアクセラレーションの有効化 はい はい
ショートクエリの最大実行時間 はい はい
優先度 はい いいえ
キューのタイプ はい はい
キュー名 はい はい
同時実行スケーリングモード はい はい
Concurrency いいえ はい
ユーザーグループ はい はい
User Group Wildcard はい はい
クエリグループ はい はい
Query Group Wildcard はい はい
Timeout いいえ 廃止
メモリ いいえ はい
クエリのモニタリングルール はい はい

次の一覧では、各キューに設定できる WLM プロパティについて説明します。

自動 WLM

自動 WLMtrue に設定すると、自動 WLM が有効になります。自動 WLM は 、[Concurrency on main (メインでの同時実行数)] と [メモリ (%)] の値を Auto に設定します。Amazon Redshift はクエリの同時実行数とメモリの割り当てを管理します。デフォルト: true

JSON プロパティ: auto_wlm

ショートクエリアクセラレーションの有効化

ショートクエリアクセラレーション (SQA) は、実行時間が短い一部のクエリを、実行時間が長いクエリよりも優先します。SQA では実行時間が短いクエリを専用領域で実行します。このため SQA クエリは、実行時間が長いクエリをキューで待機するよう強制されません。SQA によって実行時間が短いクエリの実行開始が早くなり、ユーザーへの結果表示も早くなります。SQA を有効にすると、ショートクエリの最大実行時間も指定できます。SQA を有効にするには、true を指定します。デフォルト: false

JSON プロパティ: short_query_queue

ショートクエリの最大実行時間

SQA を有効にした場合は、0 に指定することで、WLM でショートクエリの最大実行時間を動的に設定することができます。または、1~20 秒 (ミリ秒単位) で値を指定します。デフォルト値は 0 です。

JSON プロパティ: max_execution_time

優先度

優先度は、キューで実行されるクエリの優先度を設定します。優先度を設定するには、[WLM モード] を [Auto WLM] に設定する必要があります。つまり、auto_wlmtrue でなければなりません。有効な値は、highesthighnormallow、および lowest です。 デフォルトは normal です。

JSON プロパティ: priority

キューのタイプ

キュータイプは、[自動 WLM] または [手動 WLM] で使用されるキューを指定します。queue_typeauto または manual に設定します。指定されなかった場合、デフォルト値は manual です。

JSON プロパティ: queue_type

キュー名

キューの名前。キュー名は、ビジネスニーズに基づいて設定できます。キュー名は WLM 設定内で一意である必要があります。また、最大 64 文字の英数字、アンダースコア、またはスペースを使用します。引用符を含めることはできません。たとえば、ETL クエリのキューがある場合は、ETL queue と名前を付けることができます。この名前は、メトリクス、システムテーブルの値、Amazon Redshift コンソールでキューを識別するために使用されます。これらのソースの名前を使用するクエリとレポートは、名前の変更に対応できる必要があります。以前は、Amazon Redshift によってキュー名が生成されていました。キューのデフォルト名は、Queue 1Queue 2 の順に最後の Default queue という名前のキューまで続きます。

重要

キュー名を変更すると、WLM キューメトリクスの QueueName ディメンションの値 (WLMQueueLength、WLMQueueWaitTime、WLMQueriesCompletedPerSecond、WLMQueryDuration、WLMRunningQueries など) も変更されます。そのため、キュー名を変更する場合は、設定した CloudWatch のアラームを変更する必要がある場合があります。

JSON プロパティ: name

同時実行スケーリングモード

キューで同時実行スケーリングを有効にするには、[同時実行スケーリングモード] を auto に設定します。キューにルーティングされたクエリの数がキューに設定された同時実行数を超えると、対象クエリがスケーリングクラスターに送信されます。スロットが使用可能になると、クエリはメインクラスターで実行されます。デフォルト: off

JSON プロパティ: concurrency_scaling

Concurrency

手動 WLM キューで同時に実行できるクエリの数。このプロパティは、手動 WLM にのみ適用されます。同時実行スケーリングが有効な場合、キューが同時実行数レベル (クエリスロット) に達すると、対象のクエリがスケーリングクラスターに送信されます。同時実行スケーリングモードが無効な場合、スロットが使用可能になるまで、クエリはキューで待機します。範囲は 1~50 です。

JSON プロパティ: query_concurrency

ユーザーグループ

ユーザーグループ名のカンマ区切りリスト。ユーザーグループのメンバーがデータベースでクエリを実行すると、そのメンバーのクエリはユーザーグループに関連付けられたキューにルーティングされます。

JSON プロパティ: user_group

ユーザーグループのワイルドカード

ユーザーグループでワイルドカードを有効にするかどうかを示すブール値。この値が 0 の場合、ワイルドカードは無効です。この値が 1 の場合、ワイルドカードは有効です。ワイルドカードを有効にすると、「*」または「?」を使用できます。クエリを実行するときに複数のユーザーグループを指定します。詳細については、「ワイルドカード」を参照してください。

JSON プロパティ: user_group_wild_card

クエリグループ

クエリグループのカンマ区切りリスト。クエリグループのメンバーがデータベースでクエリを実行すると、そのメンバーのクエリはクエリグループに関連付けられたキューにルーティングされます。

JSON プロパティ: query_group

クエリグループのワイルドカード

クエリグループでワイルドカードを有効にするかどうかを示すブール値。この値が 0 の場合、ワイルドカードは無効です。この値が 1 の場合、ワイルドカードは有効です。ワイルドカードを有効にすると、「*」または「?」を使用できます。クエリを実行するときに複数のクエリグループを指定します。詳細については、「ワイルドカード」を参照してください。

JSON プロパティ: query_group_wild_card

タイムアウト (ms)

WLM タイムアウト (max_execution_time) は廃止されました。自動 WLM を使用している場合は使用できません。代わりに、query_execution_time を使用してクエリモニタリングルール (QMR) を作成して、経過したクエリ実行時間を制限します。詳細については、「WLM クエリモニタリングルール」を参照してください。

クエリがキャンセルされるまで実行できる最大時間 (ミリ秒単位)。場合によっては、読み取り専用クエリ (SELECT ステートメントなど) が WLM タイムアウトに伴ってキャンセルされることもあります。このような場合、WLM は、WLM キュー割り当てルールに基づいて次に一致するキューへのクエリのルーティングを試みます。クエリが他のいずれのキュー定義にも一致しない場合、クエリはキャンセルされ、デフォルトキューには割り当てられません。詳細については、WLM クエリキューのホッピングを参照してください。WLM タイムアウトは returning 状態に達したクエリには適用されません。クエリの状態を表示するには、STV_WLM_QUERY_STATE システムテーブルを参照してください。

JSON プロパティ: max_execution_time

メモリ (%)

キューに割り当てるメモリの割合。少なくとも 1 つキューに対してメモリの割合を指定する場合は、他のすべてのキューに対しても割合を指定する必要があります。合計は 100 パーセント以下とします。すべてのキューのメモリ割り当ての合計が 100% 未満である場合、未割り当て分のメモリはサービスによって管理されます。サービスは、この未割り当てメモリを、処理用メモリの追加をリクエストしたキューに一時的に割り当てることができます。

JSON プロパティ: memory_percent_to_use

クエリのモニタリングルール

WLM クエリモニタリングルールを使用することで、指定した基準または述語に基づいてクエリの WLM キューを継続的にモニタリングできます。たとえば、システムリソースを過剰に消費する傾向があるクエリをモニタリングし、指定したパフォーマンスの境界をクエリを超えたときに指定のアクションを開始することができます。

注記

プログラムでルールを作成する場合は、パラメータグループ定義に含める JSON をコンソールを使用して生成することを強くおすすめします。

特定のクエリキューにクエリモニタリングルールを関連付けます。キューごとの 25 個までルールを指定できます。すべてのキューでのルールは合計 25 個までです。

JSON プロパティ: rules

JSON プロパティの階層:

rules rule_name predicate metric_name operator value action value

ルールごとに、以下のプロパティを指定します。

  • rule_name – ルール名は WLM 設定内で一意である必要があります。ルール名には最大で 32 文字の英数字または下線を使用できます。スペースまたは疑問符を含めることはできません。キューごとの 8 個までルールを指定できます。すべてのキューでのルールは合計 8 個までです。

    • predicate – 述語は、ルールごとに最大で 3 つまで設定できます。述語ごとに、以下のプロパティを指定します。

      • metric_name – メトリクスのリストについては、Amazon Redshift Database Developer Guideクエリモニタリングのメトリクスを参照してください。

      • operator – オペレーションは =<、および > です。

      • value – アクションをトリガーする指定されたメトリクスのしきい値。

  • action – 各ルールは一つのアクションに関連付けられます。有効なアクションは以下のとおりです。

    • log

    • hop (手動 WLM でのみ利用可能)

    • abort

    • change_query_priority (自動 WLM でのみ利用可能)

次の例は、2 つの述語と rule_1 いうアクションを持つ hop という名前の WLM クエリモニタリングルール用の JSON を示しています。

"rules": [ { "rule_name": "rule_1", "predicate": [ { "metric_name": "query_execution_time", "operator": ">", "value": 100000 }, { "metric_name": "query_blocks_read", "operator": ">", "value": 1000 } ], "action": "hop" } ]

各プロパティの詳細とクエリキューの設定の戦略については、Amazon Redshift Database Developer Guideの「ワークロード管理の実装」を参照してください。

AWS CLI による wlm_json_configuration パラメータの設定

WLM を設定するには、wlm_json_configuration パラメータを変更します。この値は JavaScript Object Notation (JSON) でフォーマットされています。AWS CLI、Amazon Redshift API、またはいずれかの AWS SDK を使用して WLM を設定する場合、このセクションの残りの部分で wlm_json_configuration パラメータの JSON 構造を構築する方法を参照してください。

注記

Amazon Redshift console を使用して WLM を設定する場合、コンソールでは簡単にキューを追加してそのプロパティを設定できるため、JSON 形式について理解する必要はありません。コンソールを使用して WLM を設定する方法の詳細については、「パラメータグループを変更する」を参照してください。

次の例は、自動 WLM で 1 つのキューを定義するデフォルトの WLM 設定です。

{ "auto_wlm": true }

次の例は、同時実行数レベル (クエリスロット) が 5 である 1 つの手動 WLM キューを定義するカスタムの WLM 設定です。

{ "query_concurrency":5 }

構文

デフォルトの WLM 設定は非常にシンプルで、キューが 1 つとプロパティが 1 つしかありません。JSON 構造でキューを追加し、キューごとに複数のプロパティを設定することができます。次の構文は、複数のプロパティを持つ複数のキューを設定する場合に使用する JSON 構造を表しています。

[ { "ParameterName":"wlm_json_configuration", "ParameterValue": "[ { "q1_first_property_name":"q1_first_property_value", "q1_second_property_name":"q1_second_property_value", ... }, { "q2_first_property_name":"q2_first_property_value", "q2_second_property_name":"q2_second_property_value", ... } ... ]" } ]

前の例では、q1 で始まる代表的なプロパティは、最初のキューの配列にあるオブジェクトです。これらの各オブジェクトは名前と値のペアです。namevalue を組み合わせて最初のキューに WLM プロパティを設定します。q2 で始まる代表的なプロパティは、2 番目のキューの配列にあるオブジェクトです。より多くのキューが必要な場合、追加の各キューに別のアレイを追加し、各オブジェクトのプロパティを設定します。

WLM の設定を変更する際は、キュー内の 1 つのプロパティだけを変更する場合であっても、キューの構造全体を含める必要があります。これは、wlm_json_configuration パラメータの値として、JSON 構造全体が文字列として渡されるためです。

AWS CLI コマンドのフォーマット

AWS CLI を使用する場合、wlm_json_configuration パラメータには特定の形式が必要です。使用する形式は、クライアントのオペレーティングシステムによって異なります。コマンドラインから正しく渡されるように JSON 構造を囲む方法は、オペレーティングシステムによってさまざまです。Linux、Mac OS X、Windows の各オペレーティングシステムで適切なコマンドを作成する方法の詳細については、以下のセクションを参照してください。AWS CLI で JSON データ構造を囲む一般的な方法の違いの詳細については、AWS Command Line Interface ユーザーガイドの「文字列の引用」を参照してください。

以下のコマンド例では、example-parameter-group という名前のパラメータグループの手動 WLM を設定します。この設定により、ショートクエリアクセラレーションでショートクエリの最大実行時間が 0 に設定されます。これにより、値を動的に設定することを WLM に指示します。ApplyType 設定は dynamic です。この設定では、このパラメータ内の動的プロパティに対して行われたすべての変更は、設定に対して他の静的な変更が行われていない限り、速やかに適用されます。この設定では、次の 3 つのキューを定義しています。

  • 最初のキューにより、ユーザーは自身のキューで report をラベルとして (query_group プロパティで) 指定し、そのキューへのクエリのルーティングをスムーズにすることができます。report* ではワイルドカード検索が有効にされているため、クエリをキューにルーティングするためにラベルを正しい順序にする必要はありません。たとえば、reportsreporting のいずれも、このクエリグループに一致します。このキューにはすべてのキューの合計メモリのうち 25 パーセントが割り当てられ、最大 4 つのクエリを同時に実行できます。クエリの時間は、最大 20,000 ミリ秒 (ms) に制限されています。モードが自動に設定されているため、キューのクエリスロットがいっぱいになると、対象のクエリがスケーリングクラスターに送信されます。

  • 2 番目のキューにより、データベース内の admin または dba グループのメンバーであるユーザーは、自身のクエリを処理用にそのキューにルーティングすることができます。ユーザーグループではワイルドカード検索が無効になっているため、ユーザーは自身のクエリがそのキューにルーティングされるようにデータベース内のグループと正確に一致する必要があります。このキューにはすべてのキューの合計メモリのうち 40% が割り当てられ、最大 5 つのクエリを同時に実行できます。モードはオフに設定されているため、admin または dba グループのメンバーによって送信されたクエリはすべて、メインクラスターで実行されます。

  • 設定内の最後のキューはデフォルトキューです。このキューにはすべてのキューの合計メモリのうち 35 パーセントが割り当てられ、最大 5 つのクエリを同時に処理できます。モードは自動に設定されます。

注記

デモンストレーションの目的で、例は複数行で示されています。実際のコマンドに改行を入れることはできません。

aws redshift modify-cluster-parameter-group --parameter-group-name example-parameter-group --parameters '[ { "query_concurrency": 4, "max_execution_time": 20000, "memory_percent_to_use": 25, "query_group": ["report"], "query_group_wild_card": 1, "user_group": [], "user_group_wild_card": 0, "concurrency_scaling": "auto", "queue_type": "manual" }, { "query_concurrency": 5, "memory_percent_to_use": 40, "query_group": [], "query_group_wild_card": 0, "user_group": [ "admin", "dba" ], "user_group_wild_card": 0, "concurrency_scaling": "off", "queue_type": "manual" }, { "query_concurrency": 5, "query_group": [], "query_group_wild_card": 0, "user_group": [], "user_group_wild_card": 0, "concurrency_scaling": "auto", "queue_type": "manual" }, {"short_query_queue": true} ]'

以下に、自動 WLM 設定で、WLM クエリモニタリングルールを設定する例を示します。この例では、example-monitoring-rules という名前のパラメータグループを作成します。設定で前の例と同じ 3 つのキューを定義しますが、query_concurrency および memory_percent_to_use は、指定されません。この設定では、次のルールとクエリの優先度も追加されます。

  • 最初のキューは rule_1 というルールを定義します。ルールには 2 つの述語があります。query_cpu_time > 10000000query_blocks_read > 1000 です。ルールのアクションは log です。このキューの優先度は Normal です。

  • 2 つめのキューは rule_2 というルールを定義します。ルールには 2 つの述語があります。query_execution_time > 600000000scan_row_count > 1000000000 です。ルールのアクションは abort です。このキューの優先度は Highest です。

  • 設定内の最後のキューはデフォルトキューです。このキューの優先度は Low です。

注記

デモンストレーションの目的で、例は複数行で示されています。実際のコマンドに改行を入れることはできません。

aws redshift modify-cluster-parameter-group --parameter-group-name example-monitoring-rules --parameters '[ { "query_group" : [ "report" ], "query_group_wild_card" : 1, "user_group" : [ ], "user_group_wild_card" : 0, "concurrency_scaling" : "auto", "rules" : [{ "rule_name": "rule_1", "predicate": [{ "metric_name": "query_cpu_time", "operator": ">", "value": 1000000 }, { "metric_name": "query_blocks_read", "operator": ">", "value": 1000 } ], "action" : "log" } ], "priority": "normal", "queue_type": "auto" }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ "admin", "dba" ], "user_group_wild_card" : 0, "concurrency_scaling" : "off", "rules" : [ { "rule_name": "rule_2", "predicate": [ {"metric_name": "query_execution_time", "operator": ">", "value": 600000000}, {"metric_name": "scan_row_count", "operator": ">", "value": 1000000000}], "action": "abort"}], "priority": "high", "queue_type": "auto" }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ ], "user_group_wild_card" : 0, "concurrency_scaling" : "auto", "priority": "low", "queue_type": "auto", "auto_wlm": true }, { "short_query_queue" : true } ]'

JSON ファイルを指定してコマンドラインで AWS CLI を使用して WLM を設定する

AWS CLI を使用して wlm_json_configuration パラメータを変更し、JSON ファイルとして parameters 引数の値で渡すことができます。

aws redshift modify-cluster-parameter-group --parameter-group-name myclusterparaametergroup --parameters file://modify_pg.json

--parameters の引数は、modify_pg.json に保存されます。ファイルの場所は、オペレーティングシステムの形式で指定されます。詳細については、「ファイルからパラメータをロードする」を参照してください。modify_pg.json JSON ファイルの内容の例を以下に示します。

[ { "ParameterName": "wlm_json_configuration", "ParameterValue": "[{\"user_group\":\"example_user_group1\",\"query_group\": \"example_query_group1\", \"query_concurrency\":7},{\"query_concurrency\":5}]" } ]
[ { "ParameterName": "wlm_json_configuration", "ParameterValue": "[{\"query_group\":[\"reports\"],\"query_group_wild_card\":0,\"query_concurrency\":4,\"max_execution_time\":20000,\"memory_percent_to_use\":25},{\"user_group\":[\"admin\",\"dba\"],\"user_group_wild_card\":1,\"query_concurrency\":5,\"memory_percent_to_use\":40},{\"query_concurrency\":5,\"memory_percent_to_use\":35},{\"short_query_queue\": true, \"max_execution_time\": 5000 }]", "ApplyType": "dynamic" } ]

Linux および macOS X オペレーティングシステムのコマンドラインで AWS CLI を使用して WLM を設定する際のルール

1 行にパラメータを指定して AWS CLI コマンドを実行するには、以下のルールに従います。

  • JSON 構造全体を単一引用符 (') と角括弧 ([ ]) で囲む必要があります。

  • すべてのパラメータ名とパラメータ値は、二重引用符 (") で囲む必要があります。

  • ParameterValue 値内では、ネストされた構造全体を二重引用符 (") と角括弧 ([ ]) で囲む必要があります。

  • ネストされた構造内では、各キューのプロパティと値をそれぞれ中括弧 ({ }) で囲む必要があります。

  • ネストされた構造内では、各二重引用符 (") の前で円記号 (\) のエスケープ文字を使用する必要があります。

  • 名前と値のペアでは、各プロパティとその値をコロン (:) で区切ります。

  • 名前と値の各ペアは、カンマ (,) で区切ります。

  • 複数のキューは、キューの中括弧の末尾 (}) とその次のキューの中括弧の先頭 ({) の間にカンマ (,) を置くことで区切ります。

Microsoft Windows オペレーティングシステムの Windows PowerShell で AWS CLI を使用して WLM を設定する際のルール

1 行にパラメータを指定して AWS CLI コマンドを実行するには、以下のルールに従います。

  • JSON 構造全体を単一引用符 (') と角括弧 ([ ]) で囲む必要があります。

  • すべてのパラメータ名とパラメータ値は、二重引用符 (") で囲む必要があります。

  • ParameterValue 値内では、ネストされた構造全体を二重引用符 (") と角括弧 ([ ]) で囲む必要があります。

  • ネストされた構造内では、各キューのプロパティと値をそれぞれ中括弧 ({ }) で囲む必要があります。

  • ネストされた構造内では、各二重引用符 (") とその円記号 (\) のエスケープ文字の前で円記号 (\) のエスケープ文字を使用する必要があります。この要件は、プロパティが正しく渡されるようにするため (\\\")、3 つの円記号と 1 つの二重引用符を使用することを意味します。

  • 名前と値のペアでは、各プロパティとその値をコロン (:) で区切ります。

  • 名前と値の各ペアは、カンマ (,) で区切ります。

  • 複数のキューは、キューの中括弧の末尾 (}) とその次のキューの中括弧の先頭 ({) の間にカンマ (,) を置くことで区切ります。

Windows オペレーティングシステムでコマンドプロンプトを使用して WLM を設定する際のルール

1 行にパラメータを指定して AWS CLI コマンドを実行するには、以下のルールに従います。

  • JSON 構造全体を二重引用符 (") と角括弧 ([ ]) で囲む必要があります。

  • すべてのパラメータ名とパラメータ値は、二重引用符 (") で囲む必要があります。

  • ParameterValue 値内では、ネストされた構造全体を二重引用符 (") と角括弧 ([ ]) で囲む必要があります。

  • ネストされた構造内では、各キューのプロパティと値をそれぞれ中括弧 ({ }) で囲む必要があります。

  • ネストされた構造内では、各二重引用符 (") とその円記号 (\) のエスケープ文字の前で円記号 (\) のエスケープ文字を使用する必要があります。この要件は、プロパティが正しく渡されるようにするため (\\\")、3 つの円記号と 1 つの二重引用符を使用することを意味します。

  • 名前と値のペアでは、各プロパティとその値をコロン (:) で区切ります。

  • 名前と値の各ペアは、カンマ (,) で区切ります。

  • 複数のキューは、キューの中括弧の末尾 (}) とその次のキューの中括弧の先頭 ({) の間にカンマ (,) を置くことで区切ります。