暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Doris数据导出

沙沃兴 2024-03-08
1783

数据导出

    数据导出(Export)是Doris提供的一种将数据导出的功能。该功能可以将用户指定的表或分区的数据,以文本的格式,通过 Broker 进程导出到远端存储上,如 HDFS / 对象存储(支持S3协议) 等。


原理

    用户提交一个 Export 作业后。Doris 会统计这个作业涉及的所有 Tablet。然后根据parallelism参数(由用户指定)对这些 Tablet 进行分组。每个线程负责一组tablets,生成若干个SELECT INTO OUTFILE查询计划。该查询计划会读取所包含的 Tablet 上的数据,然后通过 S3协议 / HDFS协议 / Broker 将数据写到远端存储指定的路径中。

总体的执行流程如下:

  1. 用户提交一个 Export 作业到 FE。
  2. FE会统计要导出的所有Tablets,然后根据parallelism参数将所有Tablets分组,每一组再根据maximum_number_of_export_partitions参数生成若干个SELECT INTO OUTFILE查询计划
  3. 根据parallelism参数,生成相同个数的ExportTaskExecutor,每一个ExportTaskExecutor由一个线程负责,线程由FE的Job 调度框架去调度执行。
  4. FE的Job调度器会去调度ExportTaskExecutor并执行,每一个ExportTaskExecutor会串行地去执行由它负责的若干个SELECT INTO OUTFILE查询计划。


语法

EXPORT TABLE table_name

[PARTITION (p1[,p2])]

[WHERE]

TO export_path

[opt_properties]

WITH BROKER/S3/HDFS

[broker_properties];

说明:
  • table_name:当前要导出的表的表名。支持 Doris 本地表、视图View、Catalog外表数据的导出。
  • partition:可以只导出指定表的某些指定分区,只对Doris本地表有效。
  • export_path:导出的文件路径。可以是目录,也可以是文件目录加文件前缀,如hdfs://path/to/my_file_
  • opt_properties:用于指定一些导出参数。

[PROPERTIES ("key"="value", ...)]

可以指定如下参数:

  • label: 可选参数,指定此次Export任务的label,当不指定时系统会随机生成一个label。
  • column_separator:指定导出的列分隔符,默认为\t,支持多字节。该参数只用于csv文件格式。
  • line_delimiter:指定导出的行分隔符,默认为\n,支持多字节。该参数只用于csv文件格式。
  • columns:指定导出表的某些列。
  • format:指定导出作业的文件格式,支持:parquet, orc, csv, csv_with_names、csv_with_names_and_types。默认为csv格式。
  • max_file_size:导出作业单个文件大小限制,如果结果超过这个值,将切割成多个文件。max_file_size取值范围是[5MB, 2GB], 默认为1GB。(当指定导出为orc文件格式时,实际切分文件的大小将是64MB的倍数,如:指定max_file_size = 5MB, 实际将以64MB为切分;指定max_file_size = 65MB, 实际将以128MB为切分)
  • parallelism:导出作业的并发度,默认为1,导出作业会开启parallelism个数的线程去执行select into outfile语句。(如果parallelism个数大于表的tablets个数,系统将自动把parallelism设置为tablets个数大小,即每一个select into outfile语句负责一个tablets)
  • delete_existing_files: 默认为false,若指定为true,则会先删除export_path所指定目录下的所有文件,然后导出数据到该目录下。例如:"export_path" = "/user/tmp", 则会删除"/user/"下所有文件及目录;"file_path" = "/user/tmp/", 则会删除"/user/tmp/"下所有文件及目录。
  • with_bom: 默认为false,若指定为true,则导出的文件编码为带有BOM的UTF8编码(只对csv相关的文件格式生效)。
  • timeout:导出作业的超时时间,默认为2小时,单位是秒。


注意:要使用delete_existing_files参数,还需要在fe.conf中添加配置enable_delete_existing_files = true并重启fe,此时delete_existing_files才会生效。delete_existing_files = true 是一个危险的操作,建议只在测试环境中使用。

  • WITH HDFS:可以直接将数据写到远端HDFS上。
  • WITH S3:可以直接将数据写到远端S3对象存储上。


Doris导出数据到本地

1、配置fe.conf

    将Doris表数据通过select ...into outfile方式导出到本地文件时需要先在各个FE节点的fe.conf文件中添加“enable_outfile_to_local=true”,并重启FE集群。

    [root@ef562daade16 ~]# vi /data/doris/apache-doris-2.0.0-bin-x64/fe/conf/fe.conf

    enable_outfile_to_local=true


    注意:如果没有在fe.conf中添加enable_outfile_to_local=true参数,导入的时候会看到下面错误。

    | 11125 | export_b7da41de-f0fb-467c-ba6e-327fbe315b64 | CANCELLED | 100% |     {"partitions":    ["*"],"max_file_size":"","delete_existing_files":"","columns":"","format":"csv","broker":"local","column_separator":"\t","line_delimiter":"\n","db":"default_cluster:demo","tbl":"expo    rt_tbl","tablet_num":0} | file:///tmp/ | 2024-03-07 02:32:45 | 2024-03-07 02:32:57 | 2024-03-07 02:32:57 | 300 | type:RUN_FAIL; msg:errCode = 2, detailMessage = Exporting results to local     disk is not allowed. To enable this feature, you need to add enable_outfile_to_local=true in fe.conf and restart FE | NULL


2、在BE节点创建导出的目录,指定对应导出命令时不一定是在哪个BE节点进行导出,所以可以在所有BE接地那都创建导出目录

    [root@ef562daade16 tmp]# mkdir -p /data/export


3、创建表并导入数据

    CREATE TABLE IF NOT EXISTS demo.export_tbl

    (

    user_id LARGEINT NOT NULL COMMENT "用户id",

    date DATE NOT NULL COMMENT "数据灌入日期时间",

    timestamp DATETIME NOT NULL COMMENT "数据灌入时间,精确到秒",

    city VARCHAR(20) COMMENT "用户所在城市",

    age SMALLINT COMMENT "用户年龄",

    sex TINYINT COMMENT "用户性别",

    last_visit_date DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",

    cost BIGINT SUM DEFAULT "0" COMMENT "用户总消费",

    max_dwell_time INT MAX DEFAULT "0" COMMENT "用户最大停留时间",

    min_dwell_time INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"

    )

    ENGINE=OLAP

    AGGREGATE KEY(user_id, date, timestamp, city, age, sex)

    PARTITION BY RANGE(date)

    (

    PARTITION p1 VALUES [("2024-10-01"),("2024-10-02")),

    PARTITION p2 VALUES [("2024-10-02"),("2024-10-03")),

    PARTITION p3 VALUES [("2024-10-03"),("2024-10-04"))

    )

    DISTRIBUTED BY HASH(user_id) BUCKETS 1

    PROPERTIES (

    "replication_allocation" = "tag.location.default: 1"

    );

    #插入数据

    insert into demo.export_tbl values

    (10000,"2024-10-01","2024-10-01 08:00:05","北京",20,0,"2024-10-01 06:00:00",20,10,10),

    (10000,"2024-10-01","2024-10-01 09:00:05","北京",20,0,"2024-10-01 07:00:00",15,2,2),

    (10001,"2024-10-01","2024-10-01 18:12:10","北京",30,1,"2024-10-01 17:05:45",2,22,22),

    (10002,"2024-10-02","2024-10-02 13:10:00","上海",20,1,"2024-10-02 12:59:12",200,5,5),

    (10003,"2024-10-02","2024-10-02 13:15:00","广州",32,0,"2024-10-02 11:20:00",30,11,11),

    (10004,"2024-10-01","2024-10-01 12:12:48","深圳",35,0,"2024-10-01 10:00:15",100,3,3),

    (10004,"2024-10-03","2024-10-03 12:38:20","深圳",35,0,"2024-10-03 10:20:22",11,6,6);


4、将所有数据导出到本地存储, 默认导出csv格式文件

    [root@ef562daade16 bin]# ./mysql -uroot -P9030 -h127.0.0.1 -p

    mysql> use demo;

    mysql> EXPORT TABLE export_tbl TO "file:///data/export/"; --路径中需要指定file://参数

    mysql> show export; ---查看导出任务


5、也可以直接将表中数据导出到BE节点路径下。

    mysql> select * from export_tbl limit 100 INTO OUTFILE "file:///tmp/result_";


6、将表的user_id,city,cost列导出到本地存储,并设置label

    mysql> EXPORT TABLE demo.export_tbl TO "file:///data/export/" PROPERTIES ( "label" = "label12", "columns" = "user_id,city,cost" );


7、将user_id大于10003的行导出到本地存储,并以,作为列分隔符

    mysql> EXPORT TABLE demo.export_tbl where user_id>10003 TO "file:///data/export/" PROPERTIES ( "column_separator"=",", "columns" = "user_id,city,cost" );


注意事项

  • 关于FE配置可以通过配置fe.conf实现 1. export_checker_interval_second :Export 作业调度器的调度间隔,默认为 5 秒。设置该参数需重启 FE。2. export_running_job_num_limit :正在运行的 Export 作业数量限制。如果超过,则作业将等待并处于 PENDING 状态。默认为 5,可以运行时调整。3. export_task_default_timeout_second :Export 作业默认超时时间。默认为 2 小时。可以运行时调整。4. export_tablet_num_per_task :一个查询计划负责的最大分片数。默认为 5。5. label :用户手动指定的 EXPORT 任务 label ,如果不指定会自动生成一个 label 。
  • 不建议一次性导出大量数据。一个 Export 作业建议的导出数据量最大在几十 GB。过大的导出会导致更多的垃圾文件和更高的重试成本。
  • 如果表数据量过大,建议按照分区导出。
  • 在 Export 作业运行过程中,如果 FE 发生重启或切主,则 Export 作业会失败,需要用户重新提交。
  • 如果 Export 作业运行失败,在远端存储中产生的 __doris_export_tmp_xxx 临时目录,以及已经生成的文件不会被删除,需要用户手动删除。
  • 如果 Export 作业运行成功,在远端存储中产生的 __doris_export_tmp_xxx 目录,根据远端存储的文件系统语义,可能会保留,也可能会被清除。比如对象存储(支持S3协议)中,通过 rename 操作将一个目录中的最后一个文件移走后,该目录也会被删除。如果该目录没有被清除,用户可以手动清除。
  • 当 Export 运行完成后(成功或失败),FE 发生重启或切主,则 SHOW EXPORT 展示的作业的部分信息会丢失,无法查看。
  • Export 作业只会导出 Base 表的数据,不会导出 Rollup Index 的数据。
  • Export 作业会扫描数据,占用 IO 资源,可能会影响系统的查询延迟


数据导出 - Apache Doris

EXPORT - Apache Doris

Apache Doris-0063-数据导出-01-原理介绍 - 知乎 (zhihu.com)

大数据Doris(五十二):Doris数据导出案例和注意事项 - overfit.cn

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论