如何使用自动 WLM 管理 Amazon Redshift 中的工作负载?

上次更新时间: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" : [ ],
  "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 的存储过程。然后,向标准用户授予权限。

超级用户可以使用以下内置函数更改查询优先级:

注意:“关键”优先级状态只能使用内置函数来分配。系统中任何时候只允许有一个优先级为“关键”的查询。

监控查询优先级

要检查队列或活动查询的查询优先级,请运行以下查询:

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_tasksquery_working_mem 列也显示为值 -1

检查查询是否正在根据分配的优先级运行

根据分配的优先级、查询监控规则以及用户组和查询组的匹配通配符,将查询路由到队列。Amazon Redshift 随即会自动将查询分配给第一个匹配队列。

如果您的查询未在所需队列中运行,请检查是否满足以下条件:

  • 用户或 query_group 设置为“超级用户”:如果您的用户或查询组设置为“超级用户”,则查询在超级用户队列中运行 (service_class = 5)。
  • 用户被列为用户组的成员,但为该特定查询分配了不同的查询组:如果将查询分配到与其列出的组成员身份不同的查询组,则该查询将在第一个匹配队列中运行。默认情况下,Amazon Redshift 中的查询会按队列的设置优先级运行。
  • 没有使用内置函数的适当权限:如果您使用的是内置函数(如 CHANGE_QUERY_PRIORITYCHANGE_USER_PRIORITYCHANGE_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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?