Export
本文档将介绍如何使用EXPORT
命令导出 PALO 中存储的数据。
Export
是 PALO 提供的一种将数据异步导出的功能。该功能可以将用户指定的表或分区的数据,以指定的文件格式,导出到目标存储系统中,包括对象存储、HDFS 或本地文件系统。
Export
是一个异步执行的命令,命令执行成功后,立即返回结果,用户可以通过Show Export
命令查看该 Export 任务的详细信息。
适用场景
Export
适用于以下场景:
- 大数据量的单表导出、仅需简单的过滤条件。
- 需要异步提交任务的场景。
使用 Export
时需要注意以下限制:
- 当前不支持文本文件压缩格式的导出。
- 不支持 Select 结果集导出。若需要导出 Select 结果集,请使用OUTFILE 导出
快速上手
建表与导入数据
1CREATE TABLE IF NOT EXISTS tbl (
2 `c1` int(11) NULL,
3 `c2` string NULL,
4 `c3` bigint NULL
5)
6DISTRIBUTED BY HASH(c1) BUCKETS 20
7PROPERTIES("replication_num" = "1");
8
9
10insert into tbl values
11 (1, 'doris', 18),
12 (2, 'nereids', 20),
13 (3, 'pipelibe', 99999),
14 (4, 'Apache', 122123455),
15 (5, null, null);
创建导出作业
导出到 HDFS
将 tbl 表的所有数据导出到 HDFS 上,设置导出作业的文件格式为 csv(默认格式),并设置列分割符为 ,
。
1EXPORT TABLE tbl
2TO "hdfs://host/path/to/export_"
3PROPERTIES
4(
5 "line_delimiter" = ","
6)
7with HDFS (
8 "fs.defaultFS"="hdfs://hdfs_host:port",
9 "hadoop.username" = "hadoop"
10);
导出到对象存储
将 tbl 表中的所有数据导出到对象存储上,设置导出作业的文件格式为 csv(默认格式),并设置列分割符为,
。
1EXPORT TABLE tbl TO "s3://bucket/export/export_"
2PROPERTIES (
3 "line_delimiter" = ","
4) WITH s3 (
5 "s3.endpoint" = "xxxxx",
6 "s3.region" = "xxxxx",
7 "s3.secret_key"="xxxx",
8 "s3.access_key" = "xxxxx"
9);
查看导出作业
提交作业后,可以通过 SHOW EXPORT 命令查询导出作业状态,结果举例如下:
1mysql> show export\G
2*************************** 1. row ***************************
3 JobId: 143265
4 Label: export_0aa6c944-5a09-4d0b-80e1-cb09ea223f65
5 State: FINISHED
6 Progress: 100%
7 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"}
8 Path: s3://bucket/export/export_
9 CreateTime: 2024-06-11 18:01:18
10 StartTime: 2024-06-11 18:01:18
11 FinishTime: 2024-06-11 18:01:31
12 Timeout: 7200
13 ErrorMsg: NULL
14OutfileInfo: [
15 [
16 {
17 "fileNumber": "1",
18 "totalRows": "6001215",
19 "fileSize": "747503989",
20 "url": "s3://bucket/export/export_6555cd33e7447c1-baa9568b5c4eb0ac_*"
21 }
22 ]
23]
241 row in set (0.00 sec)
有关 show export 命令的详细用法及其返回结果的各个列的含义可以参看 SHOW EXPORT
取消导出作业
提交 Export 作业后,在 Export 任务成功或失败之前可以通过 CANCEL EXPORT 命令取消导出作业。取消命令举例如下:
1CANCEL EXPORT FROM dbName WHERE LABEL like "%export_%";
导出说明
导出数据源
EXPORT
当前支持导出以下类型的表或视图
- PALO 内表
- PALO 逻辑视图
- External Catalog 中的表
导出数据存储位置
Export
目前支持导出到以下存储位置:
- 对象存储:Amazon S3、COS、OSS、OBS、Google GCS
- HDFS
导出文件类型
EXPORT
目前支持导出为以下文件格式:
- Parquet
- ORC
- csv
- csv_with_names
- csv_with_names_and_types
导出示例
导出到开启了高可用的 HDFS 集群
如果 HDFS 开启了高可用,则需要提供 HA 信息,如:
1EXPORT TABLE tbl
2TO "hdfs://HDFS8000871/path/to/export_"
3PROPERTIES
4(
5 "line_delimiter" = ","
6)
7with HDFS (
8 "fs.defaultFS" = "hdfs://HDFS8000871",
9 "hadoop.username" = "hadoop",
10 "dfs.nameservices" = "your-nameservices",
11 "dfs.ha.namenodes.your-nameservices" = "nn1,nn2",
12 "dfs.namenode.rpc-address.HDFS8000871.nn1" = "ip:port",
13 "dfs.namenode.rpc-address.HDFS8000871.nn2" = "ip:port",
14 "dfs.client.failover.proxy.provider.HDFS8000871" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
15);
导出到开启了高可用及 kerberos 认证的 HDFS 集群
如果 Hadoop 集群开启了高可用并且启用了 Kerberos 认证,可以参考如下 SQL 语句:
1EXPORT TABLE tbl
2TO "hdfs://HDFS8000871/path/to/export_"
3PROPERTIES
4(
5 "line_delimiter" = ","
6)
7with HDFS (
8 "fs.defaultFS"="hdfs://hacluster/",
9 "hadoop.username" = "hadoop",
10 "dfs.nameservices"="hacluster",
11 "dfs.ha.namenodes.hacluster"="n1,n2",
12 "dfs.namenode.rpc-address.hacluster.n1"="192.168.0.1:8020",
13 "dfs.namenode.rpc-address.hacluster.n2"="192.168.0.2:8020",
14 "dfs.client.failover.proxy.provider.hacluster"="org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
15 "dfs.namenode.kerberos.principal"="hadoop/_HOST@REALM.COM"
16 "hadoop.security.authentication"="kerberos",
17 "hadoop.kerberos.principal"="doris_test@REALM.COM",
18 "hadoop.kerberos.keytab"="/path/to/doris_test.keytab"
19);
指定分区导出
导出作业支持仅导出 PALO 内表的部分分区,如仅导出 test 表的 p1 和 p2 分区
1EXPORT TABLE test
2PARTITION (p1,p2)
3TO "s3://bucket/export/export_"
4PROPERTIES (
5 "columns" = "k1,k2"
6) WITH s3 (
7 "s3.endpoint" = "xxxxx",
8 "s3.region" = "xxxxx",
9 "s3.secret_key"="xxxx",
10 "s3.access_key" = "xxxxx"
11);
导出时过滤数据
导出作业支持导出时根据谓词条件过滤数据,仅导出符合条件的数据,如仅导出满足 k1 < 50
条件的数据
1EXPORT TABLE test
2WHERE k1 < 50
3TO "s3://bucket/export/export_"
4PROPERTIES (
5 "columns" = "k1,k2",
6 "column_separator"=","
7) WITH s3 (
8 "s3.endpoint" = "xxxxx",
9 "s3.region" = "xxxxx",
10 "s3.secret_key"="xxxx",
11 "s3.access_key" = "xxxxx"
12);
导出外表数据
导出作业支持 Export Catalog 外表数据的导出:
1-- Create a hive catalog
2CREATE CATALOG hive_catalog PROPERTIES (
3 'type' = 'hms',
4 'hive.metastore.uris' = 'thrift://172.0.0.1:9083'
5);
6
7-- Export hive table
8EXPORT TABLE hive_catalog.sf1.lineitem TO "s3://bucket/export/export_"
9PROPERTIES(
10 "format" = "csv",
11 "max_file_size" = "1024MB"
12) WITH s3 (
13 "s3.endpoint" = "xxxxx",
14 "s3.region" = "xxxxx",
15 "s3.secret_key"="xxxx",
16 "s3.access_key" = "xxxxx"
17);
导出前清空导出目录
1EXPORT TABLE test TO "s3://bucket/export/export_"
2PROPERTIES (
3 "format" = "parquet",
4 "max_file_size" = "512MB",
5 "delete_existing_files" = "true"
6) WITH s3 (
7 "s3.endpoint" = "xxxxx",
8 "s3.region" = "xxxxx",
9 "s3.secret_key"="xxxx",
10 "s3.access_key" = "xxxxx"
11);
如果设置了 "delete_existing_files" = "true"
,导出作业会先将 s3://bucket/export/
目录下所有文件及目录删除,然后导出数据到该目录下。
若要使用 delete_existing_files
参数,还需要在 fe.conf
中添加配置 enable_delete_existing_files = true
并重启 fe,此时 delete_existing_files
才会生效。该操作会删除外部系统的数据,属于高危操作,请自行确保外部系统的权限和数据安全性。
设置导出文件的大小
导出作业支持设置导出文件的大小,如果单个文件大小超过设定值,则会对导出文件进行切分。
1EXPORT TABLE test TO "s3://bucket/export/export_"
2PROPERTIES (
3 "format" = "parquet",
4 "max_file_size" = "512MB"
5) WITH s3 (
6 "s3.endpoint" = "xxxxx",
7 "s3.region" = "xxxxx",
8 "s3.secret_key"="xxxx",
9 "s3.access_key" = "xxxxx"
10);
通过设置 "max_file_size" = "512MB"
,则单个导出文件的最大大小为 512MB。
注意事项
-
导出数据量
不建议一次性导出大量数据。一个 Export 作业建议的导出数据量最大在几十 GB。过大的导出会导致更多的垃圾文件和更高的重试成本。如果表数据量过大,建议按照分区导出。
另外,Export 作业会扫描数据,占用 IO 资源,可能会影响系统的查询延迟。
-
导出文件的管理
如果 Export 作业运行失败,已经生成的文件不会被删除,需要用户手动删除。
-
导出超时
若导出的数据量很大,超过导出的超时时间,则 Export 任务会失败。此时可以在 Export 命令中指定
timeout
参数来增加超时时间并重试 Export 命令。 -
导出失败
在 Export 作业运行过程中,如果 FE 发生重启或切主,则 Export 作业会失败,需要用户重新提交。可以通过
show export
命令查看 Export 任务状态。 -
导出分区数量
一个 Export Job 允许导出的分区数量最大为 2000,可以在 fe.conf 中添加参数
maximum_number_of_export_partitions
并重启 FE 来修改该设置。 -
数据完整性
导出操作完成后,建议验证导出的数据是否完整和正确,以确保数据的质量和完整性。
附录
基本原理
Export 任务的底层是执行SELECT INTO OUTFILE
SQL 语句。用户发起一个 Export 任务后,PALO 会根据 Export 要导出的表构造出一个或多个 SELECT INTO OUTFILE
执行计划,随后将这些SELECT INTO OUTFILE
执行计划提交给 PALO 的 Job Schedule 任务调度器,Job Schedule 任务调度器会自动调度这些任务并执行。
导出到本地文件系统
导出到本地文件系统功能默认是关闭的。这个功能仅用于本地调试和开发,请勿用于生产环境。
如要开启这个功能请在 fe.conf
中添加 enable_outfile_to_local=true
并且重启 FE。
示例:将 tbl 表中的所有数据导出到本地文件系统,设置导出作业的文件格式为 csv(默认格式),并设置列分割符为,
。
1EXPORT TABLE db.tbl TO "file:///path/to/result_"
2PROPERTIES (
3 "format" = "csv",
4 "line_delimiter" = ","
5);
此功能会将数据导出并写入到 BE 所在节点的磁盘上,如果有多个 BE 节点,则数据会根据导出任务的并发度分散在不同 BE 节点上,每个节点有一部分数据。
如在这个示例中,最终会在 BE 节点的 /path/to/
下生产一组类似 result_7052bac522d840f5-972079771289e392_0.csv
的文件。
具体的 BE 节点 IP 可以在 SHOW EXPORT
结果中的 OutfileInfo
列查看,如:
1[
2 [
3 {
4 "fileNumber": "1",
5 "totalRows": "0",
6 "fileSize": "8388608",
7 "url": "file:///172.20.32.136/path/to/result_7052bac522d840f5-972079771289e392_*"
8 }
9 ],
10 [
11 {
12 "fileNumber": "1",
13 "totalRows": "0",
14 "fileSize": "8388608",
15 "url": "file:///172.20.32.137/path/to/result_22aba7ec933b4922-ba81e5eca12bf0c2_*"
16 }
17 ]
18]
警告: 此功能不适用于生产环境,并且请自行确保导出目录的权限和数据安全性。