如何使用自动 WLM 管理 Amazon Redshift 中的工作负载?
我有不同的工作负载,并希望使用自动工作负载管理(WLM)创建单独的队列。如何使用 Amazon Redshift 自动 WLM 来管理我的工作负载并确定其优先顺序?
简短描述
Amazon Redshift 自动 WLM 可动态管理内存和并发性,从而帮助您优先考虑混合工作负载的查询。借助自动 WLM,Amazon Redshift 可以根据以下条件管理资源分配:
- 当查询提交到 Amazon Redshift 后,资源会根据查询优先级来进行分配。
- 如果没有竞争性工作负载,则优先级较低的查询可以访问所有系统资源。
- 若为并发工作负载,则会选择优先级更高的查询。之后,与优先级较低的查询相比,优先级较高的查询会获得更多资源分配。
- 高优先级工作负载的可预测性能,会降低其他较低优先级工作负载的性能。
**注意:**优先级较低的查询可能会以较慢的速度进行。但是,Amazon Redshift 可确保优先级较低的查询不会受资源匮乏影响。 - 由于优先级状态或使用较少的资源,优先级较低的工作负载可能会运行更长时间。
要有效地使用 Amazon Redshift 自动 WLM,请考虑以下事项:
- 为队列分配优先级。
- 更改查询的优先级。
- 监控查询的优先级。
- 检查查询是否正在根据分配的优先级运行。
解决方法
为队列分配优先级
要使用自动 WLM 管理工作负载,请执行以下步骤:
1. 定义工作负载并将其分成不同类别(例如 ETL、控制面板和分析)。
2. 识别单个用户并根据工作负载对其进行分组。
3. 创建不同的队列并将其分配给特定用户或查询组。有关详细信息,请参阅将查询分配给队列。
4. 为队列启用并发扩展功能,以便 Amazon Redshift 在需要时自动添加额外的集群容量。例如,如果您预计会遇到流量爆发,则可以对队列启用并发扩展。有关详细信息,请参阅配置并发扩展队列。
以下是自动 WLM 的 JSON 配置示例:
[ { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ "ETL_users" ], "user_group_wild_card" : 1, "priority" : "highest", "queue_type" : "auto", "auto_wlm" : true }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ "Dashboard_users" ], "user_group_wild_card" : 0, "priority" : "high", "queue_type" : "auto", "auto_wlm" : true }, { "query_group" : [ "Adhoc_query" ], "query_group_wild_card" : 1, "user_group" : [ "Analytics_users" ], "user_group_wild_card" : 1, "priority" : "normal", "queue_type" : "auto", "auto_wlm" : true }, { "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ ], "user_group_wild_card" : 0, "priority" : "low", "queue_type" : "auto", "auto_wlm" : true }, { "short_query_queue" : true } ]
**注意:**如果未设置查询优先级,则所有队列会自动设置为“正常”优先级状态。
更改查询优先级
在 Amazon Redshift 中,您可以使用 WLM 查询监控规则(QMR)或内置函数来更改队列优先级。
方法 1:WLM 查询监控规则
如果要根据基于指标的性能边界管理工作负载,请使用 WLM 查询监控规则。在设置 WLM 查询监控规则时,请指定查询优先级指标和查询优先级操作。例如:
{ "query_group" : [ ], "query_group_wild_card" : 0, "user_group" : [ ], "user_group_wild_card" : 0, "rules" : [ { "rule_name" : "long_running_queries", "predicate" : [ { "metric_name" : "query_execution_time", "operator" : ">", "value" : 3600 } ], "action" : "change_query_priority", "value" : "high" } ], "priority" : "low", "queue_type" : "auto", "auto_wlm" : true }, { "short_query_queue" : true } ]
方法 2:内置函数
**重要提示:**内置函数需要适当的权限。要使用内置函数,您要么必须是超级用户,要么超级用户必须授予您使用该函数的权限。
在 Amazon Redshift 中,内置函数独立于 WLM 配置。要授予标准用户使用内置函数的权限,请创建一个指定 SECURITY DEFINER 的存储过程。然后,向标准用户授予权限。
超级用户可以使用以下内置函数更改查询优先级:
- 查询级别:CHANGE_QUERY_PRIORITY
- 会话级别:CHANGE_SESSION_PRIORITY
- 用户级别:CHANGE_USER_PRIORITY
注意:“关键”优先级状态只能使用内置函数来分配。系统中任何时候只允许有一个优先级为“关键”的查询。
监控查询优先级
要检查队列或活动查询的查询优先级,请运行以下查询:
select query, service_class, query_priority, state from stv_wlm_query_state where service_class>=100;
要检查已完成查询的查询优先级,请使用以下查询:
select query, service_class, service_class_start_time as starttime, query_priority from stl_wlm_query where query=<query_id>;
要检查您的查询优先级是否因 QMR 规则而更改,请使用以下查询:
select * from stl_wlm_rule_action where query= <Query_ID> and action= ‘change_query_priority’;
在输出中,检查 action_value 列以验证查询的更改后优先级。
要检查您的 QMR 配置,请运行以下查询:
select * from stv_wlm_QMR_config where action= ‘change_query_priority’;
要检查 query_group 参数的当前值,请运行以下查询:
select current_setting(‘query_group’);
要检查自动 WLM 队列配置,请运行以下查询:
select s.service_class, rtrim(s.name) as name, s.num_query_tasks as slots, s.query_working_mem as mem, s.max_execution_time as max_time, s.user_group_wild_card as user_wildcard, s.query_group_wild_card as query_wildcard, rtrim(c.condition) as condition, s.query_priority from stv_wlm_service_class_config s left join stv_wlm_classification_config c on s.service_class = c.action_service_class where s.service_class > 4 order by service_class;
**注意:**如果启用了 auto_wlm 并设置为“true”,则服务类 ID 显示为 100-107。num_query_tasks 和 query_working_mem 列也显示为值 -1。
检查查询是否正在根据分配的优先级运行
根据分配的优先级、查询监控规则以及用户组和查询组的匹配通配符,将查询路由到队列。Amazon Redshift 随即会自动将查询分配给第一个匹配队列。
如果您的查询未在所需队列中运行,请检查是否满足以下条件:
- 用户或 query_group 设置为“超级用户”:如果您的用户或查询组设置为“超级用户”,则查询在超级用户队列中运行(service_class = 5)。
- 用户被列为用户组的成员,但为该特定查询分配了不同的查询组:如果将查询分配到与其列出的组成员身份不同的查询组,则该查询将在第一个匹配队列中运行。默认情况下,Amazon Redshift 中的查询会按队列的设置优先级运行。
- 没有使用内置函数的适当权限:如果您使用的是内置函数(如 CHANGE_QUERY_PRIORITY、CHANGE_USER_PRIORITY 和 CHANGE_QUERY_PRIORITY),则必须具有超级用户权限。或者,必须由超级用户授予您适当的权限才能使用内置函数。
- 用户是多个组的成员:如果您被列为多个组的成员,则查询将分配给第一个匹配队列。队列匹配是根据 WLM 查询分配规则执行的。
要确认查询优先级是否已成功更改,请运行以下查询:
select query, service_class, query_priority, state from stv_wlm_query_state where query= <Query_ID>;
要确认用户是否被列为多个组的成员,请运行以下查询:
SELECT usename, groname FROM pg_user, pg_group WHERE pg_user.usesysid = ANY(pg_group.grolist) AND pg_group.groname in (SELECT DISTINCT pg_group.groname from pg_group);
要确定是否为查询设置了查询组,请运行以下查询:
select q.userid, q.query, rtrim(q.label) as label, w.service_class, w.query_priority from stl_query q join stl_wlm_query w on q.query = w.query where q.query = <Query_ID>;
检查输出中的 label(标签)列以确认查询的组成员身份。如果查询没有匹配的查询或用户组,则其将在默认队列中运行。
相关内容
- AWS 官方已更新 10 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前