更新时间:2024-09-18 GMT+08:00

导出Doris数据至HDFS

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

  • 不建议一次性导出大量数据。一个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作业会扫描数据,占用I/O资源,可能会影响系统的查询延迟。

语法介绍

  • 导出Doris数据到HDFS
    • 集群已启用Kerberos认证(安全模式)

      EXPORT TABLE db1.tbl1

      PARTITION (p1,p2)

      [WHERE [expr]]

      TO "hdfs://主NameNode实例IP地址:RPC端口号/tmp/export/"

      PROPERTIES

      (

      "label" = "mylabel",

      "column_separator"=",",

      "columns" = "col1,col2",

      "exec_mem_limit"="2147483648",

      "timeout" = "3600"

      )

      WITH BROKER "broker_name"

      (

      "hadoop.security.authentication"="kerberos",

      "kerberos_principal"="doris/hadoop.hadoop.com@HADOOP.COM",

      "kerberos_keytab"="${BIGDATA_HOME}/FusionInsight_Doris_*/install/FusionInsight-Doris-*/doris-fe/bin/doris.keytab"

      );

    • 集群未启用Kerberos认证(普通模式)

      EXPORT TABLE db1.tbl1

      PARTITION (p1,p2)

      [WHERE [expr]]

      TO "hdfs://主NameNode实例IP地址:RPC端口号/tmp/export/"

      PROPERTIES

      (

      "label" = "mylabel",

      "column_separator"=",",

      "columns" = "col1,col2",

      "exec_mem_limit"="2147483648",

      "timeout" = "3600"

      )

      WITH BROKER "broker_name"

      (

      "username" = "user",

      "password" = "passwd"

      );

    主NameNode实例IP地址可在Manager界面,选择“集群 > 服务 > HDFS > 实例”查看。

    RPC端口号可在Manager界面,选择“集群 > 服务 > HDFS > 配置”,搜索“dfs.namenode.rpc.port”查看。

    其他参数解释表1所示。

    表1 导出Doris数据到HDFS命令相关参数介绍

    参数名称

    参数描述

    label

    本次导出作业的标识,可以使用这个标识查看作业状态。

    column_separator

    列分隔符,默认为\t,支持不可见字符,例如:'\x07'。

    columns

    要导出的列,使用英文逗号分隔,如果不设置该参数默认导出表的所有列。

    line_delimiter

    行分隔符,默认为\n,支持不可见字符,例如:'\x07'。

    exec_mem_limit

    表示导出作业中,一个查询计划在单个BE上的内存使用限制,默认为2GB,单位为字节。

    timeout

    作业超时时间,默认值为2小时,单位为秒。

    tablet_num_per_task

    每个查询计划分配的最大分片数,默认值为5。

  • 查看导出作业状态
    提交作业后,可以通过SHOW EXPORT;命令查询导出作业状态。例如:
    JobId: 14008
    State: FINISHED
    Progress: 100%
    TaskInfo: {"partitions":["*"],"exec mem limit":2147483648,"column separator":",","line delimiter":"\n","tablet num":1,"broker":"hdfs","coord num":1,"db":"default_cluster:db1","tbl":"tbl3"}
    Path: hdfs://host/path/to/export/
    CreateTime: 2019-06-25 17:08:24
    StartTime: 2019-06-25 17:08:28
    FinishTime: 2019-06-25 17:08:34
    Timeout: 3600
    ErrorMsg: NULL
    1 row in set (0.01 sec)

    参数解释如表2所示。

    表2 导出作业状态参数介绍

    参数名称

    参数描述

    JobId

    作业的ID,值唯一。

    State

    作业状态,包括:

    • PENDING:作业待调度。
    • EXPORTING:数据导出中。
    • FINISHED:作业导出成功。
    • ANCELLED:导出作业运行失败。

    Progress

    作业进度,以查询计划为单位。例如一共10个查询计划,当前已完成3个,则进度为30%。

    TaskInfo

    以JSON格式展示的作业信息,其中:

    • db:数据库名称。
    • tbl:表名称。
    • partitions:指定导出的分区,*表示所有分区。
    • exec mem limit:查询计划内存使用限制,单位为字节。
    • column separator:导出文件的列分隔符。
    • line delimiter:导出文件的行分隔符。
    • tablet num:总Tablet数量。
    • broker:使用的Broker的名称。
    • coord num:查询计划的个数。

    Path

    远端存储上的导出路径。

    CreateTime/StartTime/FinishTime:

    作业的创建时间、开始调度时间和结束时间。

    Timeout

    作业超时时间,单位是秒,该时间从CreateTime开始计算。

    ErrorMsg

    如果作业出现错误,ErrorMsg会显示错误原因。

  • 取消导出任务

    提交作业后,可以通过CANCEL_EXPORT命令取消导出作业。取消命令如下:

    CANCEL EXPORT

    FROM example_db

    WHERE LABEL like "%example%";

前提条件

  • 已创建包含Doris服务的集群,集群内各服务运行正常。
  • 待连接Doris数据库的节点与MRS集群网络互通。
  • 创建具有Doris管理权限的用户。
    • 集群已启用Kerberos认证(安全模式)

      在FusionInsight Manager中创建一个人机用户,例如“dorisuser”,创建一个拥有“Doris管理员权限”的角色绑定给该用户。

      使用新建的用户dorisuser重新登录FusionInsight Manager,修改该用户初始密码。

    • 集群未启用Kerberos认证(普通模式)

      使用admin用户连接Doris后,创建具有管理员权限的角色并绑定给用户。

  • 已安装MySQL客户端,相关操作可参考使用MySQL客户端连接Doris

导出Doris数据至HDFS示例

  1. 登录安装了MySQL的节点,执行以下命令,连接Doris数据库。

    如果集群已启用Kerberos认证(安全模式),需先执行以下命令再连接Doris数据库:

    export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1

    mysql -u数据库登录用户 -p数据库登录用户密码 -P数据库连接端口 -hDoris FE实例IP地址

    • 数据库连接端口为Doris FE的查询连接端口,可以通过登录Manager,单击“集群 > 服务 > Doris > 配置”,查询Doris服务的“query_port”参数获取。
    • Doris FE实例IP地址可通过登录MRS集群的Manager界面,单击“集群 > 服务 > Doris > 实例”,查看任一FE实例的IP地址。
    • 用户也可以使用MySQL连接软件或者Doris WebUI界面连接数据库。

  2. 执行以下命令创建数据库:

    create database if not exists example_db;

  3. 执行以下命令创建表:

    CREATE TABLE example_db.test_export_tbl (

    `c1` int NOT NULL,

    `c2` int NOT NULL,

    `c3` string NOT NULL,

    `c4` date NOT NULL

    ) ENGINE=OLAP

    DUPLICATE KEY(`c1`, `c2`)

    DISTRIBUTED BY HASH(`c1`) BUCKETS 1;

  4. 执行以下命令插入数据:

    insert into example_db.test_export_tbl values(1,1,1,"2020-02-21"),(2,2,2,"2020-03-21"),(3,3,3,"2020-04-21");

  5. 执行以下命令导出“test_export_tbl”表数据到HDFS中:

    EXPORT TABLE example_db.test_export_tbl

    TO "hdfs://主NameNode实例IP地址:RPC端口号/tmp/export/"

    PROPERTIES

    (

    "label" = "label_exporthdfs_20230218031",

    "column_separator"=",",

    "columns" = "c1,c2,c3,c4",

    "exec_mem_limit"="2147483648",

    "timeout" = "3600"

    )

    with broker "broker_192_168_67_78"

    (

    "hadoop.security.authentication"="kerberos",

    "kerberos_principal"="doris/hadoop.hadoop.com@HADOOP.COM",

    "kerberos_keytab"="${BIGDATA_HOME}/FusionInsight_Doris_8.3.0/install/FusionInsight-Doris-1.2.3/doris-fe/bin/doris.keytab"

    );

  6. 执行以下命令查询导出作业状态:

    SHOW EXPORT;

相关配置参数

登录FusionInsight Manager,选择“集群 > 服务 > Doris > 配置 > FE(角色) > 自定义”,在自定义参数“fe.conf.customized.configs”中新增以下参数:

  • export_checker_interval_second:Export作业调度器的调度间隔,默认为5秒。设置该参数后需重启FE。
  • export_running_job_num_limit:正在运行的Export作业数量限制。如果超过该值,则作业将等待并处于PENDING状态。默认值为5,可以在作业运行时调整。
  • export_task_default_timeout_second:Export作业默认超时时间,默认为2小时,可以在作业运行时调整。
  • export_tablet_num_per_task:一个查询计划负责的最大分片数,默认为5。
  • label:用户手动指定的EXPORT任务label,如果不指定会自动生成一个label。