使用 EXPORT 导出数据
本文介绍如何通过 EXPORT 语句把 StarRocks 集群中指定表或分区上的数据以 CSV 的格式导出到外部存储系统。当前支持导出到分布式文件系统 HDFS 或 AWS S3、阿里云 OSS、腾讯云 COS、华为云 OBS 等云存储系统。
背景信息
在 v2.4 及以前版本,StarRocks 在使用 EXPORT 导出数据时需要借助 Broker 才能访问外部存储系统,称为“有 Broker 的导出”。导出语句中需要通过 WITH BROKER "<broker_name>"
来指定使用哪个 Broker。Broker 是一个独立的无状态服务,封装了文件系统接口,能够帮助 StarRocks 将数据导出到外部存储系统。
自 v2.5 起,StarRocks 在使用 EXPORT 导出数据时不需要借助 Broker 即可访问外部存储系统,称为“无 Broker 的导出”。导出语句中也不再需要指定 broker_name
,但继续保留 WITH BROKER
关键字。
需要注意的是,无 Broker 的导出在数据源为 HDFS 的某些场景下会受限,这时您可以继续执行有 Broker 的导出,包括:
- 在配置了多 HDFS 集群时,您需要为每一个 HDFS 集群部署一个独立的 Broker。
- 在配置了单 HDFS 集群、但是多 Kerberos 用户时,您只需要部署一个独立的 Broker。
说明
您可以通过 SHOW BROKER 语句来查看集群中已经部署的 Broker。如果集群中没有部署 Broker,请参见部署 Broker 节点完成 Broker 部署。
支持的外部存储系统
- 分布式文件系统 HDFS
- 云存储系统,包括 AWS S3、阿里云 OSS、腾讯云 COS、华为云 OBS
注意事项
-
建议不要一次性导出大量数据。一个导出作业建议的导出数据量最大为几十 GB。一次性导出过量数据可能会导致导出失败,重试的成本也会增加。
-
如果表数据量过大,建议按照分区导出。
-
在导出作业运行过程中,如果 FE 发生重启或切主,会导致导出作业失败,您需要重新提交导出作业。
-
导出作业运行完成后(成功或失败),若 FE 发生重启或切主,则 SHOW EXPORT 语句返回的导出作业信息会发生部分丢失,无法查看。
-
导出作业只会导出原始表 (Base Table) 的数据,不会导出物化视图的数据。
-
导出作业会扫描数据,占用 I/O 资源,可能会影响系统的查询延迟。
导出流程
提交一个导出作业后,StarRocks 会统计这个作业涉及的所有 Tablet,然后对这些 Tablet 进行分组,每组生成一个特殊的查询计划。该查询计划会读取所包含的 Tablet 上的数据,然后将数据写到远端存储上指定的路径中。
导出作业的总体处理流程如下图所示。
导出作业的总体处理流程主要包括以下三个步骤:
- 用户提交一个导出作业到 Leader FE。
- Leader FE 会先向集群中所有的 BE 发送
snapshot
命令,对所有涉及到的 Tablet 做一个快照,以保持导出数据的一致性,并生成多个导出子任务。每个子任务即为一个查询计划,每个查询计划会负责处理一部分 Tablet。 - Leader FE 会把一个个导出子任务发送给 BE 执行。
基本原理
在执行查询计划的时候,StarRocks 会首先在指定的远端存储上的路径中,建立一个名为 __starrocks_export_tmp_xxx
的临时目录,其中,xxx
为导出作业的查询 ID,例如 __starrocks_export_tmp_921d8f80-7c9d-11eb-9342-acde48001122
。每个查询计划执行成功以后,导出的数据都会先写入到这个临时目录下生成的一个临时文件。
当所有数据都导出后,StarRocks 会通过 RENAME 语句把这些文件保存到到指定的路径中。