数据导出

某些情况下,用户希望将 Doris 中的数据导出到其他系统做进一步分析。

Doris 目前支持通过以下方式将数据导出:

  1. Export
    EXPORT命令主要用于将全表(或指定分区)的内容导出到远端存储,比如 HDFS上。
    该方式目前仅支持指定表或分区进行全量的导出。不支持对导出结果进行映射、过滤或转换操作。导出格式为 CSV。
    具体可参阅文档:全量数据导出。

  2. SELECT OUTFILE
    SELECT OUTFILE 命令可以将用户的 SQL 查询结果导出到远端存储(HDFS)或本地目录中。
    该方式可以通过灵活的 SQL 语法获取期望的结果。但受限于最终结果的单线程产出,导出效率要低于 Export 的方式。
    具体可参阅文档:导出查询结果集。

  3. 导出到外部表
    用户可以通过 INSERT 命令将数查询结果导出到外部表中。
    具体可参阅:导出数据到外部表。

1.全量数据导出

全量数据导出(Export)是 Doris 提供的一种将数据导出的功能。

该功能可以将用户指定的表或分区的数据,以文本的格式,通过 Broker 进程导出到远端存储上,如 HDFS/BOS 等。

本文档主要介绍 Export 功能的基本使用方式。

功能介绍

Export 功能是一个异步执行的作业。用户通过 Export 语句指定需要导出的表或者表中某些分区后,系统将生成分布式数据扫描计划,由多个 Compute Node 节点共同完成数据扫描读取的工作,并通过 Broker 进程写到远端存储上。

导出功能的最小粒度是表的分区。

目前的导出功能较为简单,仅支持对表进行全列导出,不支持对表中列进行映射、转换和过滤操作。

提交导出作业

通过如下语句提交一个导出作业

  1. EXPORT TABLE db1.tbl1
  2. PARTITION (p1,p2)
  3. [WHERE [expr]]
  4. TO "hdfs://host/path/to/export/"
  5. PROPERTIES
  6. (
  7. "column_separator"=",",
  8. "exec_mem_limit"="2147483648",
  9. "timeout" = "3600"
  10. )
  11. WITH BROKER "hdfs"
  12. (
  13. "username" = "user",
  14. "password" = "passwd",
  15. );

该语句指定将 example_tbl 表的 p1p2 两个分区导出到 HDFS的 hdfs://host/path/to/export/ 目录下。

导出命令的详细帮助,请参阅 EXPORT。

导出作业的执行

导出作业会生成多个查询计划,每个查询计划负责扫描一部分数据分片(Tablet)。

每个查询计划默认扫描 5 个 Tablet。即假设一共 100 个 Tablet,则会生成 20 个查询计划。

用户也可以在提交作业时,通过作业属性 tablet_num_per_task 指定这个数值。

一个作业的多个查询计划顺序执行。

一个查询计划扫描多个分片,将读取的数据以行的形式组织,每 1024 行为一个批次,调用 Broker 写入到远端存储上。

查询计划遇到错误会整体自动重试 3 次。如果一个查询计划重试 3 次依然失败,则整个作业失败。

导出文件的结构

导出作业会首先在指定的远端存储的路径中,建立一个名为 __doris_export_tmp_12345 的临时目录(其中 12345 为作业 id)。

导出的数据首先会写入这个临时目录。每个查询计划会生成一个文件,文件名示例:

  1. export-data-c69fcf2b6db5420f-a96b94c1ff8bccef-1561453713822

其中 c69fcf2b6db5420f-a96b94c1ff8bccef 为查询计划的 ID。1561453713822 为文件生成的时间戳。

当所有数据都导出后,Doris 会将这些文件移动到用户指定的路径中。

查看作业进度

提交作业后,可以通过 SHOW EXPORT 命令查询导入作业状态。结果举例如下:

  1. JobId: 14008
  2. State: FINISHED
  3. Progress: 100%
  4. TaskInfo: {"partitions":["p1", "p2"],"exec mem limit":2147483648,"column separator":",","line delimiter":"\n","tablet num":1,"broker":"hdfs","coord num":1,"db":"default_cluster:db1","tbl":"tbl3"}
  5. Path: bos://my_bucket/export/
  6. CreateTime: 2019-06-25 17:08:24
  7. StartTime: 2019-06-25 17:08:28
  8. FinishTime: 2019-06-25 17:08:34
  9. Timeout: 3600
  10. ErrorMsg: N/A

当作业状态为 FINISHED 时,即表示导出完成。

关于 SHOW EXPORT 的详细帮助,请参阅:SHOW EXPORT

2.导出查询结果集

本文档介绍如何使用 SELECT INTO OUTFILE 命令进行查询结果的导出操作。

功能介绍

SELECT INTO OUTFILE 语句可以将查询结果导出到文件中。

目前支持通过 Broker 进程导出到远端存储,如 HDFS上。或者直接导出到 Compute Node 所在节点的本地磁盘上。

用户可以通过这个命令,借助灵活的 SQL 语法,将期望的查询结果进行导出。

执行导出命令

SELECT INTO OUTFILE 本质上是一个同步的 SQL 查询命令。因此受到会话变量 query_timeout 的超时限制。如果导出较大结果集或 SQL 本身执行时间较长时,请先设置合理的超时时间。

  1. 导出到 HDFS
    1. SELECT * FROM tbl
    2. INTO OUTFILE "hdfs:/path/to/result_"
    3. FORMAT AS CSV
    4. PROPERTIES
    5. (
    6. "broker.name" = "my_broker",
    7. "broker.hadoop.security.authentication" = "kerberos",
    8. "broker.kerberos_principal" = "doris@YOUR.COM",
    9. "broker.kerberos_keytab" = "/home/doris/my.keytab"
    10. "column_separator" = ",",
    11. "line_delimiter" = "\n",
    12. "max_file_size" = "100MB"
    13. );


以上命令将 SQL 语句 SELECT * FROM example_tbl 的结果导出到 HDFS 上。

  1. 导出到 Compute Node 节点的本地磁盘
    1. SELECT * FROM example_tbl
    2. INTO OUTFILE "file:///home/work/path/result_"
    3. FORMAT AS CSV
    4. PROPERTIES
    5. (
    6. "column_separator" = ",",
    7. "line_delimiter" = "\n",
    8. "max_file_size" = "100MB"
    9. );


以上命令会将结果导出到某一个 Compute Node 节点的指定磁盘路径上。
公有云 Doris 用户因无法直接访问节点,因此不支持导出到本地磁盘的功能。

  1. 导出到 HDFS,并在成功后生成一个标识文件。
    1. SELECT * FROM example_tbl
    2. INTO OUTFILE "hdfs:/path/to/result_"
    3. FORMAT AS CSV
    4. PROPERTIES
    5. (
    6. "broker.name" = "my_broker",
    7. "broker.hadoop.security.authentication" = "kerberos",
    8. "broker.kerberos_principal" = "doris@YOUR.COM",
    9. "broker.kerberos_keytab" = "/home/doris/my.keytab"
    10. "column_separator" = ",",
    11. "line_delimiter" = "\n",
    12. "max_file_size" = "100MB"
    13. );


以上命令将 SQL 语句 SELECT * FROM example_tbl 的结果导出到 HDFS上。并会在成功后,创建一个 result_SUCCESS 的空文件标识。用户可以通过这个标识,来判断导出是否完成。

关于语句的详细说明,请参阅 SELECT INTO OUTFILE。

查看返回结果

导出命令为同步命令。命令返回,即表示操作结束。同时会返回一行结果来展示导出的执行结果。

如果正常导出并返回,则结果如下:

  1. mysql> select * from tbl1 limit 10 into outfile "file:///home/work/path/result_";
  2. +------------+-----------+----------+--------------+
  3. | FileNumber | TotalRows | FileSize | URL |
  4. +------------+-----------+----------+--------------+
  5. | 1 | 2 | 8 | 192.168.1.10 |
  6. +------------+-----------+----------+--------------+
  7. 1 row in set (0.05 sec)
  • FileNumber:最终生成的文件个数。
  • TotalRows:结果集行数。
  • FileSize:导出文件总大小。单位字节。
  • URL:如果是导出到本地磁盘,则这里显示具体导出到哪个 Compute Node。

如果执行错误,则会返回错误信息,如:

  1. mysql> SELECT * FROM tbl INTO OUTFILE ...
  2. ERROR 1064 (HY000): errCode = 2, detailMessage = Open broker writer failed ...

3.导出数据到外部表

Doris 支持通过 INSERT 命令直接将数据写入到 ODBC 外部表,作为数据导出的一种方式。

首先须通过 CREATE ODBC TABLE名创建一个 ODBC 外部表。

之后可以通过如下命令将数据写入外部表:

  1. INSERT INTO extern_tbl VALUES(1, 2, 3);
  2. INSERT INTO extern_tbl SELECT * FROM other_tbl;

写入操作是单 ODBC Client 连接方式写入,因此不建议一次性提交大量数据写入。

同时,Doris 支持对 ODBC 外部表的写入事务支持。可以通过设置会话变量 enable_odbc_transcation 开启事务支持后,执行 INSERT 命令:

  1. SET enable_odbc_transcation = true;
  2. INSERT INTO extern_tbl SELECT * FROM other_table;

事务支持可以保证数据写入的原子性,不会出现只有部分数据写入的情况。

开启写入事务会降低写入效率,请酌情开启。

关于 INSERT 命令的更多信息,请参阅 INSERT。