跳到主要内容
最后于 更新

Export 异步导出

本文档介绍如何使用 EXPORT 命令将 Doris 中存储的数据异步导出到外部存储系统。

EXPORT 是 Doris 提供的异步数据导出功能,可将指定表或分区的数据,以指定文件格式导出到对象存储、HDFS 或本地文件系统。

命令执行后立即返回,可通过 SHOW EXPORT 查询任务状态。

适用场景​

场景类型是否推荐使用 EXPORT说明
大数据量单表导出推荐仅需简单过滤条件即可
异步任务提交推荐命令立即返回,不阻塞客户端
导出 SELECT 结果集不支持请改用 OUTFILE 导出
文本文件压缩导出不支持当前版本不支持文本文件压缩格式

关于 SELECT INTO OUTFILE 与 EXPORT 的选型,请参阅 导出综述。

EXPORT 命令的完整语法详见 EXPORT。

能力概览​

支持的数据源​

EXPORT 支持导出以下类型的表或视图:

  • Doris 内表
  • Doris 逻辑视图
  • External Catalog 中的表(如 Hive 外表)

支持的存储位置​

存储类型具体支持
对象存储Amazon S3、腾讯云 COS、阿里云 OSS、华为云 OBS、Google GCS
分布式文件系统HDFS
本地文件系统仅用于本地调试和开发,需手动开启

支持的文件格式​

  • Parquet
  • ORC
  • CSV
  • csv_with_names
  • csv_with_names_and_types

快速上手​

第一步:建表与导入数据​

CREATE TABLE IF NOT EXISTS tbl (
`c1` int(11) NULL,
`c2` string NULL,
`c3` bigint NULL
)
DISTRIBUTED BY HASH(c1) BUCKETS 20
PROPERTIES("replication_num" = "1");

INSERT INTO tbl VALUES
(1, 'doris', 18),
(2, 'nereids', 20),
(3, 'pipelibe', 99999),
(4, 'Apache', 122123455),
(5, NULL, NULL);

第二步:创建导出作业​

导出到 HDFS​

将 tbl 表所有数据导出到 HDFS,使用默认 CSV 格式,列分隔符为 ,:

EXPORT TABLE tbl
TO "hdfs://host/path/to/export_"
PROPERTIES
(
"line_delimiter" = ","
)
WITH HDFS (
"fs.defaultFS"="hdfs://hdfs_host:port",
"hadoop.username" = "hadoop"
);

导出到对象存储(S3)​

将 tbl 表所有数据导出到 S3 对象存储,使用默认 CSV 格式,列分隔符为 ,:

EXPORT TABLE tbl TO "s3://bucket/export/export_" 
PROPERTIES (
"line_delimiter" = ","
) WITH s3 (
"s3.endpoint" = "xxxxx",
"s3.region" = "xxxxx",
"s3.secret_key"="xxxx",
"s3.access_key" = "xxxxx"
);

第三步:查看导出作业状态​

通过 SHOW EXPORT 命令查询导出任务的执行进度与结果:

mysql> SHOW EXPORT\G
*************************** 1. row ***************************
JobId: 143265
Label: export_0aa6c944-5a09-4d0b-80e1-cb09ea223f65
State: FINISHED
Progress: 100%
TaskInfo: {"partitions":[],"parallelism":5,"data_consistency":"partition","format":"csv","broker":"S3","column_separator":"\t","line_delimiter":"\n","max_file_size":"2048MB","delete_existing_files":"","with_bom":"false","db":"tpch1","tbl":"lineitem"}
Path: s3://bucket/export/export_
CreateTime: 2024-06-11 18:01:18
StartTime: 2024-06-11 18:01:18
FinishTime: 2024-06-11 18:01:31
Timeout: 7200
ErrorMsg: NULL
OutfileInfo: [
[
{
"fileNumber": "1",
"totalRows": "6001215",
"fileSize": "747503989",
"url": "s3://bucket/export/export_6555cd33e7447c1-baa9568b5c4eb0ac_*"
}
]
]
1 row in set (0.00 sec)

返回结果中各列的详细含义,请参考 SHOW EXPORT。

第四步:取消导出作业(可选)​

在 Export 任务成功或失败之前,可通过 CANCEL EXPORT 命令取消任务:

CANCEL EXPORT FROM dbName WHERE LABEL like "%export_%";

进阶使用示例​

导出到高可用 HDFS 集群​

如果 HDFS 启用了高可用(HA),需要额外提供 HA 相关参数:

EXPORT TABLE tbl 
TO "hdfs://HDFS8000871/path/to/export_"
PROPERTIES
(
"line_delimiter" = ","
)
WITH HDFS (
"fs.defaultFS" = "hdfs://HDFS8000871",
"hadoop.username" = "hadoop",
"dfs.nameservices" = "your-nameservices",
"dfs.ha.namenodes.your-nameservices" = "nn1,nn2",
"dfs.namenode.rpc-address.HDFS8000871.nn1" = "ip:port",
"dfs.namenode.rpc-address.HDFS8000871.nn2" = "ip:port",
"dfs.client.failover.proxy.provider.HDFS8000871" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
);

导出到 HA + Kerberos 认证的 HDFS 集群​

如果 Hadoop 集群同时启用了高可用和 Kerberos 认证,可参考以下 SQL:

EXPORT TABLE tbl 
TO "hdfs://HDFS8000871/path/to/export_"
PROPERTIES
(
"line_delimiter" = ","
)
WITH HDFS (
"fs.defaultFS"="hdfs://hacluster/",
"hadoop.username" = "hadoop",
"dfs.nameservices"="hacluster",
"dfs.ha.namenodes.hacluster"="n1,n2",
"dfs.namenode.rpc-address.hacluster.n1"="192.168.0.1:8020",
"dfs.namenode.rpc-address.hacluster.n2"="192.168.0.2:8020",
"dfs.client.failover.proxy.provider.hacluster"="org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
"dfs.namenode.kerberos.principal"="hadoop/_HOST@REALM.COM",
"hadoop.security.authentication"="kerberos",
"hadoop.kerberos.principal"="doris_test@REALM.COM",
"hadoop.kerberos.keytab"="/path/to/doris_test.keytab"
);

仅导出指定分区​

仅导出 Doris 内表的部分分区数据,例如仅导出 test 表的 p1 和 p2 分区:

EXPORT TABLE test
PARTITION (p1,p2)
TO "s3://bucket/export/export_"
PROPERTIES (
"columns" = "k1,k2"
) WITH s3 (
"s3.endpoint" = "xxxxx",
"s3.region" = "xxxxx",
"s3.secret_key"="xxxx",
"s3.access_key" = "xxxxx"
);

按谓词条件过滤后导出​

通过 WHERE 子句过滤数据,仅导出满足条件的行,例如仅导出 k1 < 50 的数据:

EXPORT TABLE test
WHERE k1 < 50
TO "s3://bucket/export/export_"
PROPERTIES (
"columns" = "k1,k2",
"column_separator"=","
) WITH s3 (
"s3.endpoint" = "xxxxx",
"s3.region" = "xxxxx",
"s3.secret_key"="xxxx",
"s3.access_key" = "xxxxx"
);

导出 External Catalog 外表数据​

EXPORT 支持导出 External Catalog 外表(如 Hive 外表)的数据:

-- 创建 Hive Catalog
CREATE CATALOG hive_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083'
);

-- 导出 Hive 表
EXPORT TABLE hive_catalog.sf1.lineitem TO "s3://bucket/export/export_"
PROPERTIES(
"format" = "csv",
"max_file_size" = "1024MB"
) WITH s3 (
"s3.endpoint" = "xxxxx",
"s3.region" = "xxxxx",
"s3.secret_key"="xxxx",
"s3.access_key" = "xxxxx"
);

导出前清空目标目录​

通过 delete_existing_files 参数,可在导出前清空目标目录:

EXPORT TABLE test TO "s3://bucket/export/export_"
PROPERTIES (
"format" = "parquet",
"max_file_size" = "512MB",
"delete_existing_files" = "true"
) WITH s3 (
"s3.endpoint" = "xxxxx",
"s3.region" = "xxxxx",
"s3.secret_key"="xxxx",
"s3.access_key" = "xxxxx"
);

启用条件与行为说明:

  • 设置 "delete_existing_files" = "true" 后,导出作业会先删除 s3://bucket/export/ 目录下的所有文件及子目录,再导出数据。
  • 该参数生效需要在 fe.conf 中添加 enable_delete_existing_files = true 并重启 FE。
警告

该操作会删除外部系统的数据,属于高危操作,请自行确保外部系统的权限和数据安全性。

控制单个导出文件大小​

通过 max_file_size 控制单个导出文件大小,超过设定值会自动切分:

EXPORT TABLE test TO "s3://bucket/export/export_"
PROPERTIES (
"format" = "parquet",
"max_file_size" = "512MB"
) WITH s3 (
"s3.endpoint" = "xxxxx",
"s3.region" = "xxxxx",
"s3.secret_key"="xxxx",
"s3.access_key" = "xxxxx"
);

max_file_size 取值规则如下:

版本范围最小值最大值
2.1.11 之前 / 3.0.7 之前5MB2GB
2.1.11 及以后 / 3.0.7 及以后5MB无限制

注意事项与最佳实践​

关注点建议与说明
单作业数据量单个 Export 作业建议不超过几十 GB;表数据量大时建议按分区分批导出,避免产生更多垃圾文件和重试成本
系统资源影响Export 作业会扫描数据,占用 IO 资源,可能影响查询延迟
失败文件管理作业运行失败时,已生成的文件不会被自动删除,需要用户手动清理
导出超时数据量过大可能触发超时;可在 Export 命令中通过 timeout 参数延长超时时间后重试
FE 重启或切主运行过程中 FE 重启或切主会导致作业失败;可通过 SHOW EXPORT 查看状态,需重新提交
分区数量上限单个 Export Job 最多导出 2000 个分区;可在 fe.conf 中调整 maximum_number_of_export_partitions 并重启 FE
数据完整性校验导出完成后建议校验数据条数与正确性,确保数据质量

附录​

基本原理​

EXPORT 任务底层基于 SELECT INTO OUTFILE SQL 语句执行,整体流程如下:

  1. 用户提交 EXPORT 任务。
  2. Doris 根据要导出的表,构造一个或多个 SELECT INTO OUTFILE 执行计划。
  3. 将这些执行计划提交给 Doris 的 Job Schedule 任务调度器。
  4. Job Schedule 自动调度并执行这些任务,最终生成导出文件。

导出到本地文件系统​

警告

导出到本地文件系统仅用于本地调试和开发,请勿用于生产环境,并请自行确保导出目录的权限和数据安全性。

启用方式​

该功能默认关闭,启用步骤:

  1. 在 fe.conf 中添加 enable_outfile_to_local=true。
  2. 重启 FE 使配置生效。

使用示例​

将 tbl 表所有数据导出到本地文件系统,使用默认 CSV 格式,列分隔符为 ,:

EXPORT TABLE db.tbl TO "file:///path/to/result_"
PROPERTIES (
"format" = "csv",
"line_delimiter" = ","
);

数据分布说明​

  • 数据会被写入到 BE 节点本地磁盘。
  • 多 BE 节点环境下,数据会按导出任务的并发度分散到不同 BE 节点上,每个节点保存一部分数据。
  • 上例中,最终会在 BE 节点的 /path/to/ 目录下生成形如 result_7052bac522d840f5-972079771289e392_0.csv 的文件。

查看具体 BE 节点​

具体的 BE 节点 IP 可在 SHOW EXPORT 结果的 OutfileInfo 列查看:

[
[
{
"fileNumber": "1",
"totalRows": "0",
"fileSize": "8388608",
"url": "file:///172.20.32.136/path/to/result_7052bac522d840f5-972079771289e392_*"
}
],
[
{
"fileNumber": "1",
"totalRows": "0",
"fileSize": "8388608",
"url": "file:///172.20.32.137/path/to/result_22aba7ec933b4922-ba81e5eca12bf0c2_*"
}
]
]