第4.2章:StarRocks数据导出--Export

Export是StarRocks提供的将数据导出至HDFS、OSS、COS或S3等对象存储上的导出方式(当前仅支持导出为CSV文件),使用Export需要在集群中提前部署Broker组件。

Export通常用于数据备份或数据迁移,支持导出表级或者分区级的数据,目前支持导出StarRocks内部表(不会一同导出物化视图表中的数据)和MySQL外表中的数据,单次导出的数据量建议控制在几十GB级别以避免过高的任务失败重试成本。

StarRocks官网对Export的相关介绍如下:

导出总览 @ Export @ StarRocks Docs第4.2章:StarRocks数据导出--Exporthttps://docs.starrocks.com/zh-cn/main/unloading/Export

EXPORT @ EXPORT @ StarRocks Docs第4.2章:StarRocks数据导出--Exporthttps://docs.starrocks.com/zh-cn/main/sql-reference/sql-statements/data-manipulation/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对照表

访问域名和数据中心 - 对象存储 OSS - 阿里云第4.2章:StarRocks数据导出--Exporthttps://help.aliyun.com/document_detail/31837.html?spm=a2c6h.13066369.0.0.11384123BRZZFf

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"

);

上一篇:1.大数据概述


下一篇:ARST第二周打卡