文档

计算组(Warehouse)使用说明

更新时间:

本文为您介绍在StarRocks中如何使用指定的计算组

前提条件

已创建StarRocks 3.3及以上的存算分离版实例,详情请参见创建实例该版本目前处于白名单模式。

注意事项

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

查看所有Warehouse信息

SHOW WAREHOUSES [LIKE '<pattern>'];

Query、Load等操作使用指定计算组

说明

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

Query操作使用指定计算组

Query只支持通过setVar方式或在当前Session中手动切换Warehouse来指定使用的Warehouse。

  • setVar方式指定

    以指定Warehouse为test为例,/*+SET_VAR(warehouse="test")*/为固定写法,非注释内容。语法如下:

    SELECT /*+SET_VAR(warehouse="test")*/ * FROM my_db.my_table;
  • 在当前Session中手动切换

    1. 指定使用某个Warehouse。

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

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

    2. 查看当前使用的Warehouse。

      SHOW variables LIKE "%warehouse%";

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

    3. 执行Query或其他SQL。

      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 example1.csv \
        -XPUT http://<fe_host>:<fe_http_port>/api/<database_name>/<table_name>/_stream_load

    参数说明如下表所述。

    参数名称

    是否必须

    参数说明

    username:password

    用于指定StarRocks集群账号的用户名和密码。如果账号没有设置密码,这里只需要传入<username>:,如:root:

    label

    用于指定导入作业的标签。如果您不指定标签,StarRocks会自动为导入作业生成一个标签。相同标签的数据无法多次成功导入,这样可以避免一份数据重复导入。

    timeout

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

    max_filter_ratio

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

    warehouse

    用于指定Stream Load使用的Warehouse。

    fe_host

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

    说明

    如果您直接提交导入作业给某一个BE(或CN)节点,则需要传入该BE(或CN)的IP地址。

    fe_http_port

    指定StarRocks集群中FE的HTTP端口号。默认端口号为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" 参数,默认值为当前Session的Warehouse。例如:

    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" 参数,默认值为当前Session的Warehouse。

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

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

    CREATE ROUTINE LOAD my_db.routine_load_basic_types_xxx 
    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"
    );

物化视图使用指定计算组

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

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

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

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 materilized views WHERE name="order_mv";
  • 方式二:执行以下命令,查看创建物化视图 "order_mv" 的完整SQL语句。

    SHOW CREATE materilized VIEW order_mv;

Compaction使用指定计算组

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

例如,想要指定名为test的Warehouse做Compaction。

  • 方式一:您可以通过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信息。

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> 

权限相关

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

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

权限

用途

USAGE

使用指定的Warehouse。

拥有Warehouse的Usage权限,默认也具备Show权限。

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

GRANT USAGE ON warehouse waa TO user1;

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