上次更新时间:2020 年 10 月 15 日
我有不同的工作负载,并希望使用自动工作负载管理 (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_wild_card" : 0,
"user_group" : ,
"user_group_wild_card" : 1,
"priority" : "highest",
"queue_type" : "auto",
"auto_wlm" : true
}, {
"query_group" : ,
"query_group_wild_card" : 0,
"user_group" : ,
"user_group_wild_card" : 0,
"priority" : "high",
"queue_type" : "auto",
"auto_wlm" : true
}, {
"query_group" : ,
"query_group_wild_card" : 1,
"user_group" : ,
"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" : ,
"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>;
检查输出中的标签列以确认查询的组成员身份。如果查询没有匹配的查询或用户组,则其将在默认队列中运行。</p