在存算分离架构中,计算节点与共享存储相互独立。您可以将一组 BE 节点组成一个计算组(Compute Group),以实现查询与导入任务的资源隔离和弹性管理。在包含多个计算组的环境中,确保查询、导入任务和外部工具能正确路由到指定的计算组,可以保障生产环境的稳定性。
如果在操作时未明确指定计算组,Doris 会根据当前会话、用户默认设置以及用户权限选择可用的计算组。为避免任务路由到非预期的计算组,我们建议在生产环境中为用户设置默认的计算组,并在执行关键的查询或导入任务时显式指定计算组。
说明
本文介绍的语法基于 Doris 3.0.8 和 4.0 版本。从 Doris 4.0 版本开始,在 Query、Stream Load 和 Flink Doris Connector 场景中,cloud_cluster 和 compute_group 两种写法均受支持且效果相同。更多信息,请参见官方文档:Compute Group 与存算分离运维指南。
在普通用户使用前,管理员需要为其授予 USAGE_PRIV 权限。关于授权和计算组管理的更多操作说明,请参见官方文档 Compute Group。
例如,为用户 jack 授予使用 query_group 和 load_group 两个计算组的权限:
GRANT USAGE_PRIV ON COMPUTE GROUP query_group TO 'jack'; GRANT USAGE_PRIV ON COMPUTE GROUP load_group TO 'jack';
您可以为用户预设一个默认计算组。用户连接后未做任何切换操作时,所有任务将默认路由到此计算组。
以下示例中,管理员(拥有 Admin 权限)为用户 jack 指定默认计算组为 query_group:
SET PROPERTY FOR 'jack' 'default_compute_group' = 'query_group';
用户也可以为自己设置默认的计算组:
SET PROPERTY 'default_compute_group' = 'query_group';
设置后,可以使用 SHOW PROPERTY 命令进行验证:
-- 查看指定用户的属性 SHOW PROPERTY FOR 'jack'; -- 查看当前用户的属性 SHOW PROPERTY;
您可以在当前会话中切换到指定计算组。此操作会影响后续在该会话中执行的所有查询。
以下示例在当前会话中切换到 query_group,后续的 SELECT 查询将在该计算组中执行:
-- 仅切换计算组 USE @query_group; -- 同时指定数据库和计算组 USE my_db@query_group; -- 后续查询将在此计算组中执行 SELECT * FROM my_table;
此切换操作仅对当前会话生效。
您可以通过以下命令查看所有可用的计算组以及当前所在的组:
SHOW COMPUTE GROUPS;
从 Doris 4.0 版本开始,您可以通过 Hint (cloud_cluster 或 compute_group) 为单条 SQL 查询指定计算组。
以下示例使用 SET_VAR Hint 让当前查询在 query_group 中执行:
SELECT /*+ SET_VAR(cloud_cluster='query_group') */ * FROM my_db.my_table;
说明
SET_VAR(cloud_cluster=...) 适合为单条 SQL 进行临时路由。如果需要连续执行多条查询,建议使用 USE @group 切换会话。
您可以通过在 HTTP Header 中设置 cloud_cluster 参数,为 Stream Load 任务指定计算组。从 Doris 4.0 版本起,也支持使用等效的 compute_group 参数。
以下示例通过 curl 命令提交 Stream Load 任务,并使用 -H "cloud_cluster:load_group" Header 指定在 load_group 中执行:
curl --location-trusted -u jack:password \ -H "label:load_001" \ -H "cloud_cluster:load_group" \ -H "column_separator:," \ -T data.csv \ -X PUT http://fe_host:8030/api/my_db/my_table/_stream_load
建议将请求发送至 FE 并开启重定向功能。通过 Header 指定的计算组优先级高于用户设置的默认组。完整的语法和参数说明,请参见官方文档 Stream Load。
Flink Doris Connector 在底层通过 Stream Load 写入数据。您可以设置 sink.properties.cloud_cluster 参数,将计算组配置透传给 Stream Load 任务。从 Doris 4.0 版本开始,也支持使用 sink.properties.compute_group 参数,两者效果相同。
以下示例在 Flink SQL 中创建 Doris Sink 表时,通过 'sink.properties.cloud_cluster' = 'load_group' 参数指定计算组:
CREATE TABLE doris_sink ( id BIGINT, name STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'doris', 'fenodes' = 'fe_host:8030', 'table.identifier' = 'my_db.my_table', 'username' = 'jack', 'password' = 'password', 'auto-redirect' = 'true', 'sink.label-prefix' = 'flink_load', 'sink.properties.cloud_cluster' = 'load_group' );
说明
设置 auto-redirect=true 可以确保请求首先发送至 FE,再由 FE 根据指定的计算组选择合适的 BE 节点。更多参数和使用方法,请参见官方文档 Flink Doris Connector。
Broker Load 会在任务创建时绑定当前会话的计算组。因此,您需要先切换到目标计算组,再提交 Broker Load 任务。任务提交后,将持续使用创建时绑定的计算组。更多说明,请参见官方文档 Broker Load。
以下示例分两步提交 Broker Load 任务:
-- 1. 切换到用于导入的计算组 USE my_db@load_group; -- 2. 提交 Broker Load 任务 LOAD LABEL my_db.broker_load_001 ( DATA INFILE("s3://bucket/path/data.csv") INTO TABLE my_table FORMAT AS "CSV" ) WITH S3 ( "AWS_ENDPOINT" = "https://s3.example.com", "AWS_ACCESS_KEY" = "******", "AWS_SECRET_KEY" = "******", "AWS_REGION" = "region" ) PROPERTIES ( "timeout" = "3600" );
与 Broker Load 类似,Routine Load 也会在任务创建时绑定计算组。您需要在创建任务前使用 USE @group 切换会话。一旦任务创建,其计算组便无法更改。更多说明,请参见官方文档 Routine Load。
以下示例分两步创建 Routine Load 任务:
-- 1. 切换到用于导入的计算组 USE my_db@load_group; -- 2. 创建 Routine Load 任务 CREATE ROUTINE LOAD my_db.kafka_job ON my_table COLUMNS TERMINATED BY "," PROPERTIES ( "desired_concurrent_number" = "3" ) FROM KAFKA ( "kafka_broker_list" = "kafka_host:9092", "kafka_topic" = "my_topic", "property.kafka_default_offsets" = "OFFSET_BEGINNING" );
您可以在 JDBC URL 的数据库名后通过 @ 符号追加计算组名称来指定计算组。
以下示例在 JDBC 连接字符串中直接指定 query_group:
jdbc:mysql://fe_host:9030/my_db@query_group
对于使用连接池的场景,您也可以在获取连接后,通过执行 USE 命令来切换计算组。
以下示例在获取连接后,执行 USE 命令将会话切换到 query_group:
USE my_db@query_group;
建议为 Superset 创建一个独立的 Doris 用户,并为其绑定默认的计算组。这样做可以避免因连接池复用而导致查询路由到错误的计算组(即路由漂移)。
以下示例创建专用的 superset_user 并设置其默认计算组:
-- 1. 为 Superset 用户授权 GRANT USAGE_PRIV ON COMPUTE GROUP query_group TO 'superset_user'; -- 2. 为该用户设置默认计算组 SET PROPERTY FOR 'superset_user' 'default_compute_group' = 'query_group';
您也可以在配置 Superset 数据库连接时,通过 init_command 参数为每个新连接设置初始命令。
以下示例在 SQLAlchemy URI 中添加 init_command 参数:
doris://superset_user:password@fe_host:9030/my_db?init_command=use @compute_group_name
更多配置说明,请参见官方文档 Superset。