Greenplum资源管理——Resource Group使用和实现分析

Greenplum是一款广泛应用的开源MPP数据库的产品,兼容PostgreSQL生态,被广泛应用与大数据的存储与分析。

Resource Group是Greenplum的一种资源管理方式。Resource Group由GP5开始被支持,相比于早期的Resource Queue的资源管理方式,具有支持更细粒度的资源管理、 支持组内资源共享等优点。本文会介绍Resource Group的使用方式,从源码角度分析它的实现,以及介绍一些使用中遇到的高频问题。

 

Resource Group简介

Resource Group是Greenplum的一种资源管理方式,能够细粒度定义对不同数据库角色(用户)的资源使用限制,支持通过SQL语句的方式进行配置。Resource Group支持进行三种类型的资源限制:并发限制、CPU限制、内存限制。

超级用户可以通过SQL在数据库内定义多个资源组,并设置每个资源组的资源限制。在一个数据库中,每个资源组可以关联一个或多个数据库用户,而每个数据库用户只能归属于单个资源组。资源组支持的资源限制配置如下:

CONCURRENCY 资源组中允许的最大并发事务数,包括活动和空闲事务。
CPU_RATE_LIMIT 此资源组可用的CPU资源百分比。
CPUSET 为该资源组保留的CPU核心数。
MEMORY_LIMIT 该资源组可用的内存资源百分比。
MEMORY_SHARED_QUOTA 提交到该资源组的事务之间共享的内存资源百分比。
MEMORY_SPILL_RATIO 内存密集型事务的内存使用阈值。当事务达到此阈值时,它将溢出到磁盘。

    
 CONCURRENCY代表最大并发事务数;CPU_RATE_LIMIT代表以百分比形式限制CPU使用,各个资源组设置的CPU_RATE_LIMIT之和不超过100%;CPUSET代表以CPU核的形式限制CPU,设置具体使用哪几个CPU逻辑核;MEMORY_LIMIT代表资源组最多能占用的集群可用内存的百分比,由MEMORY_LIMIT设定的部分属于资源组的固定份额,而各个资源组MEMORY_LIMIT之和低于100%的部分,被划分所有资源组的共享内存池;MEMORY_SHARED_QUOTA代表资源组内用于各个事务共享的内存比例;MEMORY_SPILL_RATIO代表溢出到磁盘的内存使用阈值。

CREATE RESOURCE GROUP rgroup1 WITH (CONCURRENCY=10, CPU_RATE_LIMIT=20, MEMORY_LIMIT=25, MEMORY_SHARED_QUOTA=20, MEMORY_SPILL_RATIO=20);

除了Resource Group,GP早期还支持Resource Queue的资源管理方式, Resource Queue通过指定MEMORY_LIMIT、ACTIVE_STATEMENTS、PRIORITY、MAX_COST字段,配置对于各个资源队列的内存、CPU、并发限制,Resource Group相对Resource queue存在以下优势:

特性 Resource Groups Resource Queues
CPU管理 细粒度(Cgroup) 基于粗粒度的优先级
内存限制 细粒度 粗粒度
并发控制 事务级别 语句级别
管理DDL、Utility语句
segment级别监控
组内内存共享

Resource Group通过Master上的并发锁实现对并发的限制,通过cgroup实现对cpu的限制,支持对内存基于vmtracker和cgroup进行两种方式的限制。

Resource Group使用

创建资源组

使用CREATE RESOURCE GROUP命令创建新资源组。

为角色创建资源组时,必须提供CPU_RATE_LIMIT或CPUSET和MEMORY_LIMIT限制值。这些限制标识要分配给此资源组的数据库资源的百分比。例如,要创建名为rgroup1的资源组,其CPU限制为20,内存限制为25:

CREATE RESOURCE GROUP rgroup1 WITH (CPU_RATE_LIMIT=20, MEMORY_LIMIT=25);

CPU限制为20由rgroup1分配到的每个角色共享。同样,内存限制为25由rgroup1分配到的每个角色共享。rgroup1使用默认的MEMORY_AUDITOR vmtracker和默认的CONCURRENCY设置为20。

数据库包含两个默认资源组:admin_group和default_group。启用资源组时,将为未明确分配资源组的任何角色分配角色功能的默认组。SUPERUSER角色分配了admin_group,非管理员角色分配了名为default_group的组。

使用以下资源限制创建默认资源组admin_group和default_group:

限制类型 admin_group default_group
CONCURRENCY 10 20
CPU_RATE_LIMIT 10 30
CPUSET -1 -1
MEMORY_LIMIT 10 30
MEMORY_SHARED_QUOTA 50 50
MEMORY_SPILL_RATIO 20 20
MEMORY_AUDITOR vmtracker vmtracker

默认资源组admin_group和default_group的CPU_RATE_LIMIT和MEMORY_LIMIT值对分段主机上的总百分比有贡献。

 

将资源组分配给角色

Greenplum资源组可用于分配给一个或多个角色(用户)。使用CREATE ROLEALTER ROLE命令的RESOURCE GROUP子句将资源组分配给数据库角色。如果未为角色指定资源组,则会为角色分配角色功能的默认组。SUPERUSER角色分配了admin_group,非管理员角色分配了名为default_group的组。

使用ALTER ROLE或CREATE ROLE命令将资源组分配给角色。例如:

ALTER ROLE bill RESOURCE GROUP rg_light;
CREATE ROLE mary RESOURCE GROUP exec;

用户可以将资源组分配给一个或多个角色。如果已定义角色层次结构,则将资源组分配给父角色不会向下传播到该角色组的成员。

如果要从角色中删除资源组分配并将角色分配为默认组,请将角色的组名称分配更改为NONE。例如:

ALTER ROLE mary RESOURCE GROUP NONE;

 

修改资源组配置

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Greenplum中,使用GROUP BY子句可以根据指定的列对结果进行分组。GROUP BY子句将返回每个不同组的聚合结果。要使用GROUP BY子句,可以按照以下步骤进行操作: 1. 在SELECT语句中,使用聚合函数(如SUM、AVG、COUNT等)对需要聚合的列进行计算。 2. 在FROM子句中指定要从中查询数据的表。 3. 在WHERE子句中,根据需要添加过滤条件。 4. 在GROUP BY子句中,指定要按照哪些列进行分组。 5. 如果需要,可以使用HAVING子句对分组后的结果进行进一步筛选。 下面是一个示例查询,展示了如何在Greenplum使用GROUP BY: ``` SELECT column1, column2, COUNT(*) FROM table_name WHERE condition GROUP BY column1, column2 HAVING condition; ``` 在上面的查询中,我们选择了两个列column1和column2进行分组,并使用COUNT函数计算每个组中的行数。你可以根据你的具体需求修改这个查询,选择不同的聚合函数和列进行分组。 中提到的子查询也可以在GROUP BY子句中使用,你可以根据自己的需求进行调整和优化。请注意,在使用GROUP BY时,你需要确保在SELECT子句中使用的列(除聚合函数外)都包含在GROUP BY子句中。 总结来说,要在Greenplum使用GROUP BY,你需要在SELECT语句中选择需要聚合的列,并在GROUP BY子句中指定按照哪些列进行分组。根据需要还可以使用聚合函数和过滤条件对结果进行进一步处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值