Export是StarRocks提供的将数据导出至HDFS、OSS、COS或S3等对象存储上的导出方式(当前仅支持导出为CSV文件),使用Export需要在集群中提前部署Broker组件。
Export通常用于数据备份或数据迁移,支持导出表级或者分区级的数据,目前支持导出StarRocks内部表(不会一同导出物化视图表中的数据)和MySQL外表中的数据,单次导出的数据量建议控制在几十GB级别以避免过高的任务失败重试成本。
StarRocks官网对Export的相关介绍如下:
导出总览 @ Export @ StarRocks Docshttps://docs.starrocks.com/zh-cn/main/unloading/Export
一、导出准备
本次演示我们使用的集群及部署组件如下表:
节点IP | 部署服务 | 端口 | 版本 | 说明 |
192.168.110.23 [starrocks] | FE | 2.1.0 | 用户名密码均为root | |
BE | ||||
Broker | 8000 | 名称为:hdfs_broker | ||
192.168.110.201 [hadoop01] | NameNode | 8020 | hadoop-3.1.3 | core-site.xml中fs.defaultFS参数的端口 |
DataNode | Hadoop所用端口均为默认 | |||
NodeManager | ||||
Hive | apache-hive-3.1.2 | 用户名密码均为starrocks | ||
192.168.110.202 [hadoop02] | DataNode | hadoop-3.1.3 | ||
ResourceManager | ||||
NodeManager | ||||
192.168.110.203 [hadoop03] | SecondaryNameNode | hadoop-3.1.3 | ||
DataNode | ||||
NodeManager |
1.1 StarRocks准备
我们使用SSB测试集中的表和数据进行演示,首先在starrocks库中创建表part:
mysql> CREATE TABLE `part` (
`p_partkey` int(11) NOT NULL COMMENT "",
`p_name` varchar(23) NOT NULL COMMENT "",
`p_mfgr` varchar(7) NOT NULL COMMENT "",
`p_category` varchar(8) NOT NULL COMMENT "",
`p_brand` varchar(10) NOT NULL COMMENT "",
`p_color` varchar(12) NOT NULL COMMENT "",
`p_type` varchar(26) NOT NULL COMMENT "",
`p_size` int(11) NOT NULL COMMENT "",
`p_container` varchar(11) NOT NULL COMMENT ""
)DUPLICATE KEY(`p_partkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 12
PROPERTIES (
"replication_num" = "1"
);
获取数据文件part.tbl,将其上传至starrocks服务器/opt/datafiles/路径,数据前三行示例如下:
1|lace spring|MFGR#1|MFGR#11|MFGR#1121|goldenrod|PROMO BURNISHED COPPER|7|JUMBO PKG
2|rosy metallic|MFGR#4|MFGR#43|MFGR#4318|blush|LARGE BRUSHED BRASS|1|LG CASE
3|green antique|MFGR#3|MFGR#32|MFGR#3210|dark|STANDARD POLISHED BRASS|21|WRAP CASE
使用Stream Load将数据导入part表中:
[root@starrocks ~]# curl --location-trusted -u root:root -H "label:part_20220226001" -H "column_separator:|" -T /opt/datafiles/part.tbl http://192.168.110.23:8030/api/starrocks/part/_stream_load
导入完成后,查看表中数据:
mysql> select count(1) from part;
+---------------+
| count(1) |
+---------------+
| 200000 |
+---------------+
1.2 HDFS准备
在hdfs中创建数据导出的目标目录:
[root@hadoop101 ~]# hadoop fs -mkdir /data_output
二、数据导出
2.1 语法介绍
Export的完整语法为:
EXPORT TABLE table_name
[PARTITION (p1[,p2])]
(col1,col2……)
TO export_path
[opt_properties]
broker;
以咱们准备的part表为例,完整的导出语句为:
EXPORT TABLE starrocks.part
PARTITION (part) --指定需要导出的分区,不写默认导出表中所有分区,part表没有指定分区,则整个表被视为一个大分区,分区名与表名相同
(p_partkey, p_category) --指定需要导出的列,列顺序可以与表结构不同,不写默认导出表中所有列,这里咱们配置仅导出两列
TO "hdfs://192.168.110.201:8020/data_output/part_" --导出路径,如果指定到目录,需要指定最后的/,否则最后的部分会被当做导出文件的前缀。若不指定前缀,默认为data_
PROPERTIES
(
"column_separator"=",", --列分隔符,默认为\t
"line_delimiter"="\n", --行分隔符,默认为\n
"load_mem_limit"="2147483648", --作业中一个查询计划在单个BE上的内存使用限制,默认2GB,单位字节
"timeout"="3600", --作业超时时间,默认为2小时,单位为秒
"include_query_id"="false" --导出文件名中是否包含query id,默认为true
)
WITH BROKER "hdfs_broker" --Broker的name
(
"username" = "starrocks" --导出所用的hdfs用户名。若我们需要导出到对象存储,这里需要填写对象存储的KeyId等信息
"password" = "" --hdfs用户名对应的密码,空密码时该项可以整个省略
);
精简掉不需要的参数,执行导出:
mysql> EXPORT TABLE starrocks.part
(p_partkey, p_category)
TO "hdfs://192.168.110.201:8020/data_output/part_"
PROPERTIES
(
"column_separator"=",",
"include_query_id"="false"
)
WITH BROKER "hdfs_broker"
(
"username" = "starrocks"
);
2.2 状态查询
Export是异步操作,执行导出后可以通过show export命令查看所有任务的导出状态。Export任务是没有label的,我们可以通过查看最后一次的查询ID,根据它来准确定位导出任务,查看导出状态。获取查询ID:
mysql> SELECT LAST_QUERY_ID();
+--------------------------------------------------------+
| last_query_id() |
+--------------------------------------------------------+
| 52c8b054-96df-11ec-b0d1-0242ac110002 |
+--------------------------------------------------------+
查看任务状态:
mysql> SHOW EXPORT WHERE queryid = "52c8b054-96df-11ec-b0d1-0242ac110002"\G
*************************** 1. row ***************************
JobId: 10922
QueryId: 52c8b054-96df-11ec-b0d1-0242ac110002
State: FINISHED
Progress: 100%
TaskInfo: {"partitions":["part"],"column separator":",","columns":["p_partkey","p_category"],"tablet num":12,"broker":"hdfs_broker","coord num":1,"db":"default_cluster:starrocks","tbl":"part","row delimiter":"\n","mem limit":2147483648}
Path: hdfs://192.168.110.201:8020/data_output/
CreateTime: 2022-02-26 08:37:25
StartTime: 2022-02-26 08:37:27
FinishTime: 2022-02-26 08:37:39
Timeout: 7200
ErrorMsg: NULL
任务状态中的参数都很易懂,咱们重点关注三个:
1)State
表示作业状态,有四种:
- PENDING:作业待调度
- EXPORING:数据导出中
- FINISHED:作业成功
- CANCELLED:作业失败
如果作业失败,ErrorMsg中会显示错误原因。例如failed on socket timeout exception,通常就是端口或者通信问题。
2)coord num
是TaskInfo中的参数,表示查询计划的个数。导出操作,本质就是将导出任务涉及的数据先查询再导出,在Export时,任务执行后,首先会对所有涉及到的Tablet进行快照,也就是说后续所有的导出都是针对快照对应的数据进行的。快照完成后,导出任务会根据数据分布及数据量,生成多个查询计划,查询计划是集群级别的,每个查询计划负责查询导出多个BE上的一部分tablet。这些查询计划根据任务线程池大小并行执行,将数据以行的形式组织,每1024行为一个batch,调用Broker写入到远端存储上。查询计划的生成规则,咱们最后介绍配置项的时候再详述。
3)Progress
表示作业进度,该进度以查询计划为单位。假设一共10个查询计划,当前已完成3个,则进度为30%。导出任务失败重试也是以查询计划为单位的,查询计划遇到错误会整体自动重试3次。如果一个查询计划重试3次依然失败,则整个作业失败。
2.3 文件查看
导出完成后,查看HDFS中的数据:
[starrocks@hadoop101 ~]$ hadoop fs -ls /data_output
Found 1 items
-rw-r--r-- 3 starrocks supergroup 2888895 2022-02-27 00:56 /data_output/part_0_0_0.csv
在Export语句中,我们配置了文件前缀part_,同时也设置了导出文件中不加查询id,所以导出后的文件名为part_0_0_0.csv。这里演示咱们用的是单节点的SstarRocks,在多节点的集群中,每次导出通常会生成多个文件,这些文件以不同的数字后缀结尾,例如前面的part_0_0_0.csv,第一个数字表示查询计划的序号,序号以0开始,咱们导出的数据量小,因此只拆分为了一个查询计划。第二个数字表示查询计划中对应BE的序号,也是从0开始,因为数据通常是分布在集群所有BE节点上的,所以通常第二个数字的范围会和BE的个数相同。第三个数字官方介绍是指BE生成文件的序号,从0开始,推测是导出大文件时用以拆分文件(最后这个数字我没有测出它的意义,在代码中还没找到具体的拆分方式)。
2.4 Export拓展用法
在执行Export之前,我其实还在Hive中使用beeline客户端创建了一个CSV数据格式的表hive_part,LOCATION指向的就是我们前面HDFS上的导出目录/data_output:
[starrocks@hadoop101 ~]$ beeline -u jdbc:hive2://hadoop101:10000 -n starrocks -p starrocks
…………
0: jdbc:hive2://hadoop101:10000>create table hive_part (p_partkey int, p_category string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",")
STORED AS TEXTFILE
LOCATION '/data_output';
导出任务完成后,我们在Hive中查看表中是否有数据:
0: jdbc:hive2://hadoop101:10000> select count(1) from hive_part;
+---------------+
| _c0 |
+---------------+
| 200000 |
+---------------+
20w条数据,没有问题。所以这也拓展出了Export的另一个用法,即可以将StarRocks中的数据导出到Hive表中。
三、配置参数及相关语法
配置文件中Export部分的配置主要是和查询计划的拆分和调度执行相关的,通常不需要调整:
配置项 | 默认值 | 作用 |
export_checker_interval_second | 5 | FE参数,Export作业调度器的调度间隔,设置该参数需重启FE。 |
export_running_job_num_limit | 5 | FE参数,全局正在运行的导出作业的最大数目,超过则作业将等待并处于PENDING状态[可在FE运行时修改]。 |
export_task_default_timeout_second | 7200 | FE参数,导出作业的默认超时时间,默认2小时[可在FE运行时修改]。 |
export_max_bytes_per_be_per_task | 268435456 | FE参数,单个导出任务在单个BE上导出的最大数据量,默认256M[可在FE运行时修改]。 |
export_task_pool_size | 5 | FE参数,导出任务线程池大小,默认5个线程。 |
3.1 查询计划数
每个Export作业生成的查询计划数跟任务导出的数据量和tablet数有关。每个查询计划中每个BE扫描的数据量由FE配置参数export_max_bytes_per_be_per_task计算得到,默认为256M(压缩后)。每个查询计划中每个BE最少处理一个Tablet,最多导出的数据量不超过配置的参数export_max_bytes_per_be_per_task(若一个tablet大于256M,也会至少处理一个tablet)。
3.2 导出语法拓展
1)数据导出至OSS:
EXPORT TABLE testTbl TO "oss://oss-package/export/"
WITH BROKER "broker_name"
(
"fs.oss.accessKeyId" = "xxx",
"fs.oss.accessKeySecret" = "yyy",
"fs.oss.endpoint" = "oss-cn-zhangjiakou-internal.aliyuncs.com"
);
fs.oss.endpoint可以参考:公共云下OSS Region和Endpoint对照表
2)数据导出至COS:
EXPORT TABLE testTbl TO "cosn://cos-package/export/"
WITH BROKER "broker_name"
(
"fs.cosn.userinfo.secretId" = "xxx",
"fs.cosn.userinfo.secretKey" = "yyy",
"fs.cosn.bucket.endpoint_suffix" = "cos.ap-beijing.myqcloud.com"
);
3)导出至S3:
EXPORT TABLE testTbl TO "s3a://s3-package/export/"
WITH BROKER "broker_name"
(
"fs.s3a.access.key" = "xxx",
"fs.s3a.secret.key" = "yyy",
"fs.s3a.endpoint" = "s3-ap-northeast-1.amazonaws.com"
);