计算组使用指南

为了进一步优化查询性能和管理灵活性,StarRocks 3.3引入了计算组(Warehouse)概念,它是StarRocks实例中的一组计算节点(CNBE),负责执行计算逻辑。本文将为您介绍在StarRocks中如何使用指定的Warehouse。

背景信息

在分布式数据库系统中,合理分配和利用资源是确保系统高性能运行的关键。StarRocks是一款高性能的MPP分析型数据库,专为实时分析和处理海量数据而设计。通过智能分布和并行执行查询,StarRocks能在保证低延迟的同时提供高吞吐量。

使用Warehouse的场景包括但不限于:

  • 负载均衡与资源隔离:将不同业务或用户群体的查询请求分配至不同的Warehouse,以实现负载均衡,确保各业务间的资源互不干扰。

  • 性能优化:对于需要快速响应的查询或重要业务,可以指定高性能的Warehouse进行执行,这些节点组可拥有更强大的计算资源或优越的网络条件。

  • 数据安全与合规性:在处理敏感数据时,支持将特定查询限定于符合安全标准或位于特定Warehouse上执行,以满足严格的数据保护法规。

为支持以上需求,StarRocks提供了一系列配置和管理功能,使用户能够灵活地指定和使用Warehouse,从而优化其查询和资源管理策略。

前提条件

已在EMR Serverless StarRocks创建实例

说明

如需新增计算组,必须创建StarRocks 3.3及以上版本的存算分离版实例。存算一体版实例仅支持默认计算组(default_warehouse),不支持多计算组模式。

注意事项

目前所有的动态分区的创建、Compaction、Schema Change操作、MV刷新、统计信息收集等异步任务默认都是在default_warehouse中进行的。因此,为了保证性能和流畅的用户使用体验,建议default_warehouse下至少配置3个计算节点。

查看Warehouse和计算节点信息

查看所有Warehouse

  • 语法

    SHOW WAREHOUSES [LIKE '<pattern>'];

    本文语法中的[LIKE '<pattern>']为可选内容,用于根据名称匹配特定的Warehouse。

    • <pattern> 支持通配符:

      • %:匹配任意长度的字符(包括零个字符)。

      • _:匹配单个字符。

    • <pattern>示例

      • LIKE 'test%':匹配以 test 开头的所有Warehouse。

      • LIKE '%_warehouse':匹配以 _warehouse 结尾的所有Warehouse。

  • 示例

    • 查看所有Warehouse。

      SHOW WAREHOUSES;
    • 按名称模式过滤。

      SHOW WAREHOUSES LIKE 'test%';

查看所有计算节点

每个节点的信息中包含其所属的Warehouse名称。

SHOW COMPUTE NODES;

查看指定Warehouse中的计算节点

  • 查看单个Warehouse的计算节点信息

    SHOW NODES FROM WAREHOUSE <warehouse_name>; 
  • 查看多个Warehouse的计算节点信息

    SHOW NODES FROM WAREHOUSES [LIKE '<pattern>']; 

    如果不指定[LIKE '<pattern>'],则会显示所有Warehouse的节点信息。

使用指定Warehouse执行操作

说明

如果没有明确指定Warehouse,所有的操作都默认在内置的default_warehouse中执行。

查询操作(Query)

Query仅支持通过SET_VAR方式或在当前Session中手动切换Warehouse,以指定使用特定的Warehouse。

使用SET_VAR指定Warehouse

StarRocks中,您可以通过 SET_VAR Hint动态指定当前查询使用的Warehouse。这种方式适用于需要临时切换Warehouse的场景,不会影响其他查询或Session配置。有关SET_VAR Hint的更多使用信息,请参见系统变量

语法如下所示。

SELECT /*+SET_VAR(warehouse="<warehouse_name>")*/ * FROM <database_name>.<table_name>;

其中/*+SET_VAR(warehouse="<warehouse_name>")*/为固定写法,用于动态设置查询级别的参数。<warehouse_name>Warehouse名称,<database_name><table_name> 为对应的数据库名和表名,您可以根据实际情况替换。

通过 SET_VAR Hint,您可以灵活地为单个查询指定Warehouse,从而实现资源隔离和性能优化。但需要注意以下几点:

  • 版本要求:必须使用StarRocks 3.3及以上版本。

  • 语法规范:确保 /*+SET_VAR(...)*/ 的位置和格式正确。

  • 权限和资源:确保目标 Warehouse 存在且用户有访问权限。

在当前Session中手动切换Warehouse

  1. 指定使用某个Warehouse。

    SET [session] warehouse [=] <warehouse_name>;

    其中,session=可写可不写,不影响语义。

  2. 查看当前使用的Warehouse。

    SHOW variables LIKE "%warehouse%";

    指定的Warehouse只在当前Session中生效。不明确指定则使用default_warehouse。Compaction、异步物化视图刷新、统计信息等异步任务都使用default_warehouse

  3. 执行查询。

    SELECT * FROM my_db.my_table;

数据导入操作(Load)

  • Stream Load

    Warehouse信息添加到HTTP请求的Header中。语法如下所示。

    curl --location-trusted -u <username>:<password> \
        -H "label:<label_name>" \
        -H "timeout:100" \
        -H "max_filter_ratio:1" \
        -H "warehouse:<warehouse_name>" \
        -T <file_path> \
        -XPUT http://<fe_host>:<fe_http_port>/api/<database_name>/<table_name>/_stream_load

    本文所涉及的参数说明详见下表。

    参数名称

    是否必须

    参数说明

    <username>:<password>

    用于指定StarRocks实例的用户名和密码。如果账号未设置密码,则只需传入<username>:,如:admin:

    label

    用于指定导入作业的标签。如果未指定标签,StarRocks将自动为导入作业生成一个标签。相同标签的数据不能多次成功导入,以此避免数据的重复导入。

    timeout

    用于导入作业的超时时间。取值范围:1~259200。单位:秒。

    max_filter_ratio

    用于指定导入作业的最大容错率,即导入作业能够容忍的因数据质量不合格而过滤掉的数据行所占的最大比例。取值范围:0~1。

    warehouse

    用于指定Stream Load使用的Warehouse。

    <file_path>

    用于指定数据文件所在的路径。

    fe_host

    用于指定StarRocks实例中FE的内网地址。该地址可在StarRocks实例的实例详情页面中查看。

    说明

    如果您直接提交导入作业给某一个BE(或CN)节点,则需要传入该BE(或CN)的IP地址。例如,您可以通过命令SHOW COMPUTE NODES;查看IP地址。

    fe_http_port

    指定StarRocks实例中FEHTTP端口号。默认端口号为8030。

    说明

    如果您直接向某一指定的BE(或CN)节点提交导入作业,则需提供该BE(或CN)的HTTP端口号。默认端口号为8040。

    database_name

    指定目标StarRocks表所属数据库的名称。

    table_name

    指定目标StarRocks表的名称。

  • 外部事务导入

    在调用/api/transaction/begin接口开启事务时,您必须指定标签Label,并将Warehouse信息添加到HTTP请求的Header中。语法如下所示。

    curl --location-trusted -u <username>:<password> \
        -H "label:<label_name>" \
        -H "db:<database_name>" \
        -H "table:<table_name>" \
        -H "warehouse::<warehouse_name>" \
        -XPOST http://<fe_host>:<fe_http_port>/api/transaction/begin

    之后,在使用/api/transaction/load/api/transaction/prepare/api/transaction/commit接口时,必须使用与/api/transaction/begin接口相同的标签,但不需要在HTTP请求的Header中再次指定warehouse信息。

  • Broker Load

    LOAD LABEL [<database_name>.]<label_name>
    (
        data_desc[, data_desc ...]
    )
    WITH BROKER
    (
        StorageCredentialParams
    )
    [PROPERTIES
    (
        opt_properties
    )
    ]

    创建导入任务的语句中opt_properties新增 "warehouse" 参数,默认值为当前SessionWarehouse。例如:

    LOAD LABEL my_db.path_extra_fields_label
    (
      DATA INFILE( "hdfs://<hdfs_ip>:9000/starrocks_test_data/hdfs_data/*.orc")
      INTO TABLE `my_tbl` 
      FORMAT AS "orc" 
    )  
    WITH BROKER hdfs_broker 
    (
      "hadoop.security.authentication" = "simple",
      "username" = "<hdfs_username>",
      "password" = "<hdfs_password>"
    ) 
     PROPERTIES
    (
      "warehouse"="test"
    );
  • Routine load

    job_properties新增warehouse参数,默认值为当前SessionWarehouse。

    CREATE ROUTINE LOAD <database_name>.<job_name> ON <table_name>
    [load_properties]
    [job_properties]
    FROM data_source
    [data_source_properties]

    使用Routine Load指定名为testWarehouse,通过持续消费Kafka中的消息并导入至StarRocks中,示例如下。

    CREATE ROUTINE LOAD my_db.routine_load_basic_types_fe824e00_680a_11ee_81d7_00163e135aa9 
    ON my_table
    COLUMNS (k1,k2,k3,k4,k5,k6,v1,v2,v3,v4,v5,v6,v7,v8), 
    COLUMNS TERMINATED BY ',',where v1 != 0 
    PROPERTIES (
        "desired_concurrent_number"="1",
        "max_error_number"="1000",
        "max_batch_interval"="7",
        "warehouse"="test"
    )
    FROM KAFKA (
        "kafka_broker_list"="<kafka_broker_ip>:<kafka_broker_port>",
        "kafka_topic"="xxx",
        "kafka_partitions"="0",
        "kafka_offsets"="OFFSET_BEGINNING"
    );
  • Flink Connector

    StarRocks提供了对Apache Flink的原生支持,可以通过Flink将数据高效地写入StarRocks。从Flink 1.2.9及之后版本开始,您可以通过配置sink.properties.warehouse参数,将数据写入到指定的计算组(Warehouse),从而实现更灵活的资源管理和性能优化。

    使用sink.properties.warehouse指定目标计算组(Warehouse)。

    sink.properties.warehouse=<warehouse_name>
    • <warehouse_name>:目标计算组的名称。

    • 如果未指定该参数,默认会使用default_warehouse计算组。

物化视图(Materialized View)

CREATE MATERIALIZED VIEW语句中PROPERTIES新增warehouse参数,默认值为当前SessionWarehouse。语法如下:

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database_name.]<mv_name>
[COMMENT ""]
[PROPERTIES ("key"="value", ...)]
AS 
<query_statement>

例如:要创建一个名为order_mv的物化视图,指定后续改写操作都在名为testWarehouse中运行,创建语句如下:

CREATE MATERIALIZED VIEW order_mv
DISTRIBUTED BY HASH(`order_id`)
REFRESH ASYNC EVERY (interval 1 MINUTE) 
PROPERTIES ("warehouse" = "test")
AS SELECT 
    order_list.order_id,
    sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;

执行成功后,可以用以下两种方式查看Warehouse信息。fe.audit.log中也会记录物化视图改写语句的执行情况,其中包含了Warehouse字段。

  • 方式一:执行以下命令,查询名为“order_mv”的物化视图的详细信息。

    SHOW materialized views WHERE name="order_mv";
  • 方式二:执行以下命令,查看创建物化视图“order_mv”的完整SQL语句。

    SHOW CREATE materialized VIEW order_mv;

Compaction

Compaction默认是在default_warehouse中执行的。如果想要指定其他Warehouse,可通过修改配置项lake_compaction_warehouse实现。支持在Session中动态修改和在fe.conf中修改后重启两种方式。

例如,想要指定名为testWarehouseCompaction。

  • 方式一:您可以通过ADMIN SET FRONTEND CONFIG命令在线修改FE动态参数。

    ADMIN SET FRONTEND CONFIG ("lake_compaction_warehouse" = "test");
  • 方式二:在fe.conf中写入lake_compaction_warehouse = test;后重启FE以使修改生效。

修改后可通过show proc '/compactions' ;查看最近的Compaction记录,最后一列是Warehouse信息。

连接指定Warehouse

JDBC连接

语法如下所示。

jdbc.url=jdbc:mysql://<mysql_host>:3306/dbName?sessionVariables=warehouse=<warehouse_name>

Superset连接

参考支持 Superset | StarRocks安装starrocks-sqlalchemy,使用init_command设置对应的Warehouse。

starrocks://<username>:<password>@<host>:<port>/<database_name>?init_command=set warehouse = <warehouse_name> 

为用户指定默认Warehouse

说明

该功能仅支持3.3.8及以上版本的存算分离实例。

您可以通过修改用户(例如,sr_user)属性,或在创建用户时指定默认使用的Warehouse(例如,sr_warehouse)。

  • 方法一:通过ALTER USER修改现有用户的属性

    ALTER USER sr_user SET PROPERTIES ('session.warehouse' = 'sr_warehouse');
  • 方法二:通过CREATE USER创建新用户并指定默认Warehouse

    CREATE USER 'sr_user' PROPERTIES ('session.warehouse' = 'sr_warehouse');

指定后,您可以通过执行SHOW PROPERTY命令来查看特定用户的属性。

权限相关

您可以通过GRANT操作对用户和角色进行授权。语法如下:

GRANT  
    { USAGE } 
    ON { WAREHOUSE <warehouse_name> [, <warehouse_name>,...] | ALL WAREHOUSE } 
    TO { ROLE | USER} {<role_name>|<user_identity>} [ WITH GRANT OPTION ]

权限

用途

USAGE

允许用户使用指定的Warehouse执行查询和其他操作。

拥有WarehouseUsage权限,默认也具备Show权限。

示例:已有用户名为user1,为其赋予USAGE权限。

GRANT USAGE ON warehouse waa TO user1;

更多权限相关操作,请参见管理用户权限