本文为您介绍StarRocks资源隔离的功能、基本概念和使用方式。
使用限制
该功能适用于EMR-5.7.0及后续版本的集群。
功能介绍
资源隔离功能可以限制查询任务对计算资源的消耗,目标是让不同租户的查询任务在同一集群执行能兼顾资源隔离并且保证集群资源利用率。
当您发起查询任务时,分类器会根据查询任务的信息进行匹配。匹配度最高的分类器才会生效,最终该分类器所属资源组为这次查询任务的资源组。
基本概念
资源组(Resource Group)
资源组包括BE(Backend)节点计算资源(CPU和内存)的配额,并且一个资源组可以绑定一个或多个分类器。 资源配额的计算方式如下:
cpu_core_limit:该资源组分配到的CPU核数占BE节点CPU核数的比例,取值为正整数。按照比例,向各个资源组分配执行线程和IO线程的CPU时间片。
例如,16核的机器,设置三个资源组rg1、rg2和rg3。三个资源组分别对应的cpu_core_limit为2、6和8,则资源组rg1、rg2和rg3分别能分配到的CPU核数为
BE节点CPU核数×(2/16)
、BE节点CPU 核数×(6/16)
、BE节点CPU核数×(8/16)
。如果资源空闲,rg1和rg2有负载,但是rg3没有请求,则rg1、rg2分配到的CPU核数分别为BE节点CPU核数×(2/8)
和BE节点CPU 核数×(6/8)
。mem_limit:使用query_pool(BE节点中用于查询的内存)的上限,取值范围为0.0~1.0。
query_pool的查看方式请参见内存管理。
分类器(Classifier)
分类器用于匹配查询任务的信息。 匹配度最高的分类器才会生效,最终该分类器所属资源组为查询任务的资源组。一个资源组可以绑定一个或多个分类器。
分类器的条件如下:
user:用户名。
role:用户所属的角色。
query_type:查询类型,目前仅支持SELECT。
source_ip:发起查询的IP地址,类型为CIDR。
分类器与查询任务的匹配方式
分类器与查询任务匹配时, 分类器的条件需要与查询任务的信息完全匹配。
如果存在多个分类器的条件与查询任务完全匹配,则需要计算不同分类器的匹配度。只有匹配度最高的分类器才会生效。匹配度的计算方式如下:
如果用户名一致,则匹配度加1。
如果用户所属Role一致,则匹配度加1。
如果查询类型一致,则该部分匹配度为
1 + 1/分类器的query_type数量
。如果发起查询的IP地址一致,则该部分匹配度为
1 + (32-cidr_prefix)/64
。
示例如下:
多个与查询任务匹配的分类器中,分类器的条件数量越多,则其匹配度越高。
--B的匹配度比A高,因为B的条件数量多。 classifier A (user='Alice') classifier B (user='Alice', source_ip = '192.168.**.**/24')
如果分类器的条件数量相等,则分类器的条件描述越精确,其匹配度越高。
--B的匹配度比A高, 因为192.168.**.**/24相对于192.168.**.**/16限定的source_ip地址范围更小。 classifier A (user='Alice', source_ip = '192.168.**.**/16') classifier B (user='Alice', source_ip = '192.168.**.**/24') --C的匹配度比D高, 因为('select')比('insert','select', 'ctas')限定的查询类型数量少。 classifier C (user='Alice', query_type in ('select')) classifier D (user='Alice', query_type in ('insert','select', 'ctas'))
功能使用
开启资源组
使用资源组时,需通过设置相应会话变量来启用Pipeline引擎。设置方式如下。
-- 当前会话启用Pipeline引擎以及资源组功能。
SET enable_pipeline_engine = true;
-- 全局启用Pipeline引擎以及资源组功能。
SET GLOBAL enable_pipeline_engine = true;
自v3.1.0起,默认启用资源组功能。会话变量enable_resource_group
弃用。
创建资源组和分类器
语法
CREATE RESOURCE GROUP group_name TO ( user='string', role='string', query_type in ('select'), source_ip='cidr' ) --创建分类器,多个分类器间用英文逗号(,)分隔。 WITH ( "cpu_core_limit" = "INT", "mem_limit" = "m%", "concurrency_limit" = "INT", "type" = "normal" --资源组的类型,固定取值为normal。 );
示例
CREATE RESOURCE GROUP rg1 TO (user='rg1_user1', role='rg1_role1', query_type in ('select'), source_ip='192.168.**.**/24'), (user='rg1_user2', query_type in ('select'), source_ip='192.168.**.**/24'), (user='rg1_user3', source_ip='192.168.**.**/24'), (user='rg1_user4'), (db='db1') WITH ( 'cpu_core_limit' = '10', 'mem_limit' = '20%', 'type' = 'normal', 'big_query_cpu_second_limit' = '100', 'big_query_scan_rows_limit' = '100000', 'big_query_mem_limit' = '1073741824' );
指定资源组(可选)
除通过分类器自动指定资源组外,您也可以通过会话变量直接指定资源组。
SET resource_group = 'group_name';
查看资源组和分类器
语法如下:
查询所有的资源组和分类器。
SHOW RESOURCE GROUPS ALL;
查询和当前用户匹配的资源组和分类器。
SHOW RESOURCE GROUPS;
查询指定的资源组和分类器。
SHOW RESOURCE GROUP <yourResourceName>;
管理资源组配额和分类器
修改资源组的配额
语法如下。
ALTER RESOURCE GROUP <yourResourceName> WITH ( 'cpu_core_limit' = '10', 'mem_limit' = '20%' );
增加或删除分类器
语法如下:
添加新的分类器。
ALTER RESOURCE GROUP <yourResourceName> ADD CLASSIFIER[,...];
删除指定的分类器。
ALTER RESOURCE GROUP <yourResourceName> DROP (CLASSIFER_ID_1, CLASSIFIER_ID_2, ...);
删除所有的分类器。
ALTER RESOURCE GROUP <yourResourceName> DROP ALL;
删除资源组
语法如下。
DROP RESOURCE GROUP <yourResourceName>;