外部表
StarRocks 支持以外部表 (External Table) 的形式,接入其他数据源。外部表指的是保存在其他数据源中的数据表,而 StartRocks 只保存表对应的元数据,并直接向外部表所在数据源发起查询。目前 StarRocks 已支持的第三方数据源包括 MySQL、Elasticsearch、Apache Hive™、StarRocks、Apache Iceberg 和 Apache Hudi。对于 StarRocks 数据源,现阶段只支持 Insert 写入,不支持读取,对于其他数据源,现阶段只支持读取,还不支持写入。
从 2.5 版本开始,查询外部数据源时支持 Data Cache,提升对热数据的查询性能。参见Data Cache。
MySQL 外部表
星型模型中,数据一般划分为维度表 (dimension table) 和事实表 (fact table)。维度表数据量少,但会涉及 UPDATE 操作。目前 StarRocks 中还不直接支持 UPDATE 操作(可以通过 Unique/Primary 数据模型实现),在一些场景下,可以把维度表存储在 MySQL 中,查询时直接读取维度表。
在使用 MySQL 的数据之前,需在 StarRocks 创建外部表 (CREATE EXTERNAL TABLE),与之相映射。StarRocks 中创建 MySQL 外部表时需要指定 MySQL 的相关连接信息,如下所示。
CREATE EXTERNAL TABLE mysql_external_table
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=mysql
PROPERTIES
(
"host" = "127.0.0.1",
"port" = "3306",
"user" = "mysql_user",
"password" = "mysql_passwd",
"database" = "mysql_db_test",
"table" = "mysql_table_test"
);
参数说明:
- host:MySQL 连接地址
- port:MySQL 连接端口号
- user:MySQL 登录用户名
- password:MySQL 登录密码
- database:MySQL 数据库名
- table:MySQL 数据库表名
StarRocks 外部表
1.19 版本开始,StarRocks 支持将数据通过外表方式写入另一个 StarRocks 集群的表中。这可以解决用户的读写分离需求,提供更好的资源隔离。用户需要首先在目标集群上创建一张目标表,然后在源 StarRocks 集群上创建一个 Schema 信息一致的外表,并在属 性中指定目标集群和表的信息。
通过 INSERT INTO 写入数据至 StarRocks 外表,可以将源集群的数据写入至目标集群。借助这一能力,可以实现如下目标:
- 集群间的数据同步。
- 读写分离。向源集群中写入数据,并且源集群的数据变更同步至目标集群,目标集群提供查询服务。
以下是创建目标表和外表的示例:
# 在目标集群上执行
CREATE TABLE t
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=olap
DISTRIBUTED BY HASH(k1) BUCKETS 10;
# 在外表集群上执行
CREATE EXTERNAL TABLE external_t
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=olap
DISTRIBUTED BY HASH(k1) BUCKETS 10
PROPERTIES
(
"host" = "127.0.0.1",
"port" = "9020",
"user" = "user",
"password" = "passwd",
"database" = "db_test",
"table" = "t"
);
# 写入数据至 StarRocks 外表,实现源集群的数据写入至目标集群。推荐生产环境使用第二种方式。
insert into external_t values ('2020-10-11', 1, 1, 'hello', '2020-10-11 10:00:00');
insert into external_t select * from other_table;
其中:
-
EXTERNAL:该关键字指定创建的是 StarRocks 外表。
-
host:该属性描述目标表所属 StarRocks 集群 Leader FE 的 IP 地址。
-
port:该属性描述目标表所属 StarRocks 集群 FE 的 RPC 访问端口。
备注为确保外表所属集群能够正常访问目标表所属 StarRocks 集群,您需要确保网络策略和防火墙设置允许以下端口的访问:
- FE 的 RPC 访问端口,可参考配置文件 fe/fe.conf 中的
rpc_port
配置取值,默认为9020
。 - BE 的 bRPC 访问端口,可参考配置文件 be/be.conf 中的
brpc_port
配置取值,默认为8060
。
- FE 的 RPC 访问端口,可参考配置文件 fe/fe.conf 中的
-
user:该属性描述目标表所属 StarRocks 集群的访问用户名。
-
password:该属性描述目标表所属 StarRocks 集群的访问密码。
-
database:该属性描述目标表所属数据库名称。
-
table:该属性描述目标表名称。
目前 StarRocks 外表使用上有以下限制:
- 仅可以在外表上执行 insert into 和 show create table 操作,不支持其他数据写入方式,也不支持查询和 DDL。
- 创建外表语法和创建普通表一致,但其中的列名等信息请保持同其对应的目标表一致。
- 外表会周期性从目标表同步元信息(同步周期为 10 秒),在目标表执行的 DDL 操作可能会延迟一定时间反应在外表上。