4.4.2 Export¶
本文档将介绍如何使用 EXPORT 命令导出 Doris 中存储的数据。
有关 EXPORT 命令的详细介绍,请参考: EXPORT
1 概述¶
Export 是 Doris 提供的一种将数据异步导出的功能。该功能可以将用户指定的表或分区的数据,以指定的文件格式,导出到目标存储系统中,包括对象存储、 HDFS 或本地文件系统。
Export 是一个异步执行的命令,命令执行成功后,立即返回结果,用户可以通过 Show Export 命令查看该 Export 任务的详细信息。
关于如何选择 SELECT INTO OUTFILE 和 EXPORT ,请参阅导出综述。
EXPORT 当前支持导出以下类型的表或视图
-
Doris内表 -
Doris逻辑视图 -
Doris Catalog表
EXPORT 目前支持以下导出格式
-
Parquet -
ORC -
csv -
csv_with_names -
csv_with_names_and_types
不支持压缩格式的导出。
示例:
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 | |
提交作业后,可以通过 SHOW EXPORT 命令查询导出作业状态,结果举例如下:
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
show export 命令返回的结果各个列的含义如下:
-
JobId:作业的唯一ID -
Label:该导出作业的标签,如果Export没有指定,则系统会默认生成一个。 -
State:作业状态:-
PENDING:作业待调度 -
EXPORTING:数据导出中 -
FINISHED:作业成功 -
CANCELLED:作业失败 -
Progress:作业进度。该进度以查询计划为单位。假设一共10个线程,当前已完成3个,则进度为30%。
-
-
TaskInfo:以Json格式展示的作业信息:-
db:数据库名 -
tbl:表名 -
partitions:指定导出的分区。空列表表示所有分区。 -
column_separator:导出文件的列分隔符。 -
line_delimiter:导出文件的行分隔符。 -
tablet num:涉及的总Tablet数量。 -
broker:使用的broker的名称。 -
coord num:查询计划的个数。 -
max_file_size:一个导出文件的最大大小。 -
delete_existing_files:是否删除导出目录下已存在的文件及目录。 -
columns:指定需要导出的列名,空值代表导出所有列。 -
format:导出的文件格式
-
-
Path:远端存储上的导出路径。 -
CreateTime/StartTime/FinishTime:作业的创建时间、开始调度时间和结束时间。 -
Timeout:作业超时时间。单位是秒。该时间从CreateTime开始计算。 -
ErrorMsg:如果作业出现错误,这里会显示错误原因。 -
OutfileInfo:如果作业导出成功,这里会显示具体的SELECT INTO OUTFILE结果信息。
提交 Export 作业后,在 Export 任务成功或失败之前可以通过 CANCEL EXPORT 命令取消导出作业。取消命令举例如下:
| SQL | |
|---|---|
1 | |
2 导出文件列类型映射¶
Export 支持导出数据为 Parquet 、 ORC 文件格式。 Parquet 、 ORC 文件格式拥有自己的数据类型, Doris 的导出功能能够自动将 Doris 的数据类型导出为 Parquet 、 ORC 文件格式的对应数据类型,具体映射关系请参阅导出综述文档的“导出文件列类型映射”部分。
3 示例¶
3.1 导出到 HDFS¶
将 db1.tbl1 表的 p1 和 p2 分区中的 col1 列和 col2 列数据导出到 HDFS 上,设置导出作业的 label 为 mylabel 。导出文件格式为 csv (默认格式),列分割符为 , ,导出作业单个文件大小限制为 512MB 。
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
如果 HDFS 开启了高可用,则需要提供 HA 信息,如:
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
如果 Hadoop 集群开启了高可用并且启用了 Kerberos 认证,可以参考如下 SQL 语句:
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
3.2 导出到 S3¶
将 s3_test 表中的所有数据导出到 s3 上,导出格式为 csv ,以不可见字符 \x07 作为行分隔符。
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 | |
3.3 导出到本地文件系统¶
export 数据导出到本地文件系统,需要在 fe.conf 中添加 enable_outfile_to_local=true 并且重启 FE 。
将 test 表中的所有数据导出到本地存储:
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
Tip
注意:导出到本地文件系统的功能不适用于公有云用户,仅适用于私有化部署的用户。并且默认用户对集群节点有完全的控制权限。 Doris 对于用户填写的导出路径不会做合法性检查。如果 Doris 的进程用户对该路径无写权限,或路径不存在,则会报错。同时处于安全性考虑,如果该路径已存在同名的文件,则也会导出失败。 Doris 不会管理导出到本地的文件,也不会检查磁盘空间等。这些文件需要用户自行管理,如清理等。
3.4 指定分区导出¶
导出作业支持仅导出 Doris 内表的部分分区,如仅导出 test 表的 p1 和 p2 分区
| SQL | |
|---|---|
1 2 3 4 5 6 | |
3.5 导出时过滤数据¶
导出作业支持导出时根据谓词条件过滤数据,仅导出符合条件的数据,如仅导出满足 k1 < 50 条件的数据
| SQL | |
|---|---|
1 2 3 4 5 6 7 | |
3.6 导出外表数据¶
导出作业支持 Doris Catalog 外表数据:
| SQL | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Tip
当前 Export 导出 Catalog 外表数据不支持并发导出,即使指定 parallelism 大于 1 ,仍然是单线程导出。
4 最佳实践¶
4.1 导出一致性¶
Export 导出支持 partition / tablets 两种粒度。 data_consistency 参数用来指定以何种粒度切分希望导出的表, none 代表 Tablets 级别, partition 代表 Partition 级别。
| SQL | |
|---|---|
1 2 3 4 5 6 | |
若设置 "data_consistency" = "partition" , Export 任务底层构造的多个 SELECT INTO OUTFILE 语句都会导出不同的 partition 。
若设置 "data_consistency" = "none" , Export 任务底层构造的多个 SELECT INTO OUTFILE 语句都会导出不同的 tablets ,但是这些不同的 tablets 有可能属于相同的 partition 。
关于 Export 底层构造 SELECT INTO OUTFILE 的逻辑,可参阅附录部分。
4.2 导出作业并发度¶
Export 可以设置不同的并发度来并发导出数据。指定并发度为 5 :
| SQL | |
|---|---|
1 2 3 4 5 6 | |
关于 Export 并发导出的原理,可参阅附录部分。
4.3 导出前清空导出目录¶
| SQL | |
|---|---|
1 2 3 4 5 6 | |
如果设置了 "delete_existing_files" = "true" ,导出作业会先将 /home/user/ 目录下所有文件及目录删除,然后导出数据到该目录下。
Warning
注意:若要使用 delete_existing_files 参数,还需要在 fe.conf 中添加配置 enable_delete_existing_files = true 并重启 fe ,此时 delete_existing_files 才会生效。 delete_existing_files = true 是一个危险的操作,建议只在测试环境中使用。
4.4 设置导出文件的大小¶
导出作业支持设置导出文件的大小,如果单个文件大小超过设定值,则会按照指定大小分成多个文件导出。
| SQL | |
|---|---|
1 2 3 4 5 | |
通过设置 "max_file_size" = "512MB" ,则单个导出文件的最大大小为 512MB 。
5 注意事项¶
-
内存限制
通常一个
Export作业的查询计划只有扫描-导出两部分,不涉及需要太多内存的计算逻辑。所以通常2GB的默认内存限制可以满足需求。但在某些场景下,比如一个查询计划,在同一个
BE上需要扫描的Tablet过多,或者Tablet的数据版本过多时,可能会导致内存不足。可以调整session变量exec_mem_limit来调大内存使用限制。 -
导出数据量
不建议一次性导出大量数据。一个
Export作业建议的导出数据量最大在几十GB。过大的导出会导致更多的垃圾文件和更高的重试成本。如果表数据量过大,建议按照分区导出。另外,
Export作业会扫描数据,占用IO资源,可能会影响系统的查询延迟。 -
导出文件的管理
如果
Export作业运行失败,已经生成的文件不会被删除,需要用户手动删除。 -
数据一致性
目前在
export时只是简单检查tablets版本是否一致,建议在执行export过程中不要对该表进行导入数据操作。 -
导出超时
若导出的数据量很大,超过导出的超时时间,则
Export任务会失败。此时可以在Export命令中指定timeout参数来增加超时时间并重试Export命令。 -
导出失败
在
Export作业运行过程中,如果FE发生重启或切主,则Export作业会失败,需要用户重新提交。可以通过show export命令查看Export任务状态。 -
导出分区数量
一个
Export Job允许导出的分区数量最大为2000,可以在fe.conf中添加参数maximum_number_of_export_partitions并重启FE来修改该设置。 -
并发导出
在并发导出时,请注意合理地配置线程数量和并行度,以充分利用系统资源并避免性能瓶颈。在导出过程中,可以实时监控进度和性能指标,以便及时发现问题并进行优化调整。
-
数据完整性
导出操作完成后,建议验证导出的数据是否完整和正确,以确保数据的质量和完整性。
6 附录¶
6.1 并发导出原理¶
Export 任务的底层是执行 SELECT INTO OUTFILE SQL 语句。用户发起一个 Export 任务后, Doris 会根据 Export 要导出的表构造出一个或多个 SELECT INTO OUTFILE 执行计划,随后将这些 SELECT INTO OUTFILE 执行计划提交给 Doris 的 Job Schedule 任务调度器, Job Schedule 任务调度器会自动调度这些任务并执行。
默认情况下, Export 任务是单线程执行的。为了提高导出的效率, Export 命令可以设置一个 parallelism 参数来并发导出数据。设置 parallelism 大于 1 后, Export 任务会使用多个线程并发的去执行 SELECT INTO OUTFILE 查询计划。 parallelism 参数实际就是指定执行 EXPORT 作业的线程数量。
一个 Export 任务构造一个或多个 SELECT INTO OUTFILE 执行计划的具体逻辑是:
-
选择导出的数据的一致性模型
根据
data_consistency参数来决定导出的一致性,这个只和语义有关,和并发度无关,用户要先根据自己的需求,选择一致性模型。 -
确定并发度
根据
parallelism参数确定由多少个线程来运行这些SELECT INTO OUTFILE执行计划。parallelism决定了最大可能的线程数。Tip
注意:即使
Export命令设置了parallelism参数,该Export任务的实际并发线程数量还与Job Schedule有关。Export任务设置多并发后,每一个并发线程都是Job Schedule提供的,所以如果此时Doris系统任务较繁忙,Job Schedule的线程资源较紧张,那么有可能分给Export任务的实际线程数量达不到parallelism个数,影响Export的并发导出。此时可以通过减轻系统负载或调整FE配置async_task_consumer_thread_num增加Job Schedule的总线程数量来缓解这个问题。 -
确定每一个
outfile语句的任务量每一个线程会根据
maximum_tablets_of_outfile_in_export以及数据实际的分区数/ buckets数来决定要拆分成多少个outfile。maximum_tablets_of_outfile_in_export是FE的配置,默认值为10。该参数用于指定Export任务切分出来的单个OutFile语句中允许的最大partitions / buckets数量。修改该配置需要重启FE。举例:假设一张表共有
20个partition,每个partition都有5个buckets,那么该表一共有100个buckets。设置data_consistency = none以及maximum_tablets_of_outfile_in_export = 10。-
parallelism = 5情况下Export任务将把该表的100个buckets分成5份,每个线程负责20个buckets。每个线程负责的20个buckets又将以10个为单位分成2组,每组buckets各由一个outfile查询计划负责。所以最终该Export任务有5个线程并发执行,每个线程负责2个outfile语句,每个线程负责的outfile语句串行的被执行。 -
parallelism = 3情况下Export任务将把该表的100个buckets分成3份,3个线程分别负责34、33、33个buckets。每个线程负责的buckets又将以10个为单位分成4组(最后一组不足10个buckets),每组buckets各由一个outfile查询计划负责。所以该Export任务最终有3个线程并发执行,每个线程负责4个outfile语句,每个线程负责的outfile语句串行的被执行。 -
parallelism = 120情况下由于该表
buckets只有100个,所以系统会将parallelism强制设为100,并以parallelism = 100去执行。Export任务将把该表的100个buckets分成100份,每个线程负责1个buckets。每个线程负责的1个buckets又将以10个为单位分成1组(该组实际就只有1个buckets),每组buckets由一个outfile查询计划负责。所以最终该Export任务有100个线程并发执行,每个线程负责1个outfile语句,每个outfile语句实际只导出1个buckets。
-
当前版本若希望 Export 有一个较好的性能,建议设置以下参数:
-
打开
session变量enable_parallel_outfile。 -
设置
Export的parallelism参数为较大值,使得每一个线程只负责一个SELECT INTO OUTFILE查询计划。 -
设置
FE配置maximum_tablets_of_outfile_in_export为较小值,使得每一个SELECT INTO OUTFILE查询计划导出的数据量较小。