
# 导出Doris数据至HDFS
数据导出（Export）功能可以将用户指定的表或分区的数据，以文本的格式通过Broker进程导出到远端存储上，如HDFS/对象存储（支持S3协议） 等。
Export是一个异步执行的命令，命令执行成功后立即返回结果，可以通过**SHOW EXPORT;**命令查看该Export任务的详细信息。
#### 约束与限制
- 不建议一次性导出大量数据。一个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_keytab_principal}",
    "kerberos_keytab"="/home/omm/doris_keytab/doris.keytab",
    "dfs.nameservices" = "hacluster",
    "dfs.ha.namenodes.hacluster" = "37,36",
    "dfs.namenode.rpc-address.hacluster.37" = "主NameNode实例IP地址:RPC端口号",
    "dfs.namenode.rpc-address.hacluster.36" = "备NameNode实例IP地址:RPC端口号",
    "dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
    );
    ```
    
  
  - 集群未启用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",
    "dfs.nameservices" = "hacluster",
    "dfs.ha.namenodes.hacluster" = "37,36",
    "dfs.namenode.rpc-address.hacluster.37" = "主NameNode实例IP地址:RPC端口号",
    "dfs.namenode.rpc-address.hacluster.36" = "备NameNode实例IP地址:RPC端口号",
    "dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
    );
    ```
    
  
  
  **"exec_mem_limit"="2147483648"**配置仅适用于MRS 3.6.0-LTS之前版本。
  主备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。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
  | broker_name                                  | 表示Broker名称，可在MySQL客户端执行**show broker;**命令查看。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
  | kerberos_principal                           | 访问Hadoop集群的keytab文件对应的principal。 - MRS 3.5.0之前版本，参数值为"doris/hadoop.hadoop.com@HADOOP.COM"。  - MRS 3.5.0及之后版本，格式为"**doris/hadoop** **.** *${系统域名转换为小写}* **@** *${系统域名}*"，系统域名可登录Manager页面，选择"系统 \> 权限 \> 域和互信"，查看"本端域"参数获取。例如，查看到的系统域名为"A39A7DF8_953D_4772_B909_035A594FFA55.COM"，则该参数值为"doris/hadoop.a39a7df8_953d_4772_b909_035a594ffa55.com@A39A7DF8_953D_4772_B909_035A594FFA55.COM"。   |
  | kerberos_keytab                              | 访问Hadoop集群的keytab文件，该keytab位于FE节点的"${BIGDATA_HOME}/FusionInsight_Doris_\*/install/FusionInsight-Doris-\*/doris-be/bin/doris.keytab"路径中，需要拷贝该keytab文件到所有Broker节点上，例如**"**/home/omm/doris_keytab"目录下，并执行以下命令设置"doris.keytab"文件属组： **chown omm:wheel** */home/omm/doris_keytab* **-R**                                                                                                                                                                                                                                                                                  |
  | dfs.nameservices                             | 集群NameService名称。可在NameNode所在节点的"${BIGDATA_HOME}/FusionInsight_HD_\*/1_\*_NameNode/etc"目录下的"hdfs-site.xml"中查找该配置项的值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
  | dfs.ha.namenodes.hacluster                   | 集群NameService前缀，包含两个值。可在NameNode所在节点的"${BIGDATA_HOME}/FusionInsight_HD_\*/1_\*_NameNode/etc"目录下的"hdfs-site.xml"中查找该配置项的值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
  | dfs.client.failover.proxy.provider.hacluster | 指定HDFS客户端连接集群中Active状态节点的Java类，值为"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     
  
 
- 导出Doris数据到OBS **EXPORT TABLE** *db1.tbl1*
  **TO "obs://** *mrs-doris-obs/test/* **"**
  **PROPERTIES**
  **(**
  **"label" = "mylabel",**
  **"column_separator"=",",**
  **"columns" = "** *col1,col2* **",**
  **"timeout" = "3600"**
  **)**
  **WITH BROKER "** *broker_name* **"**
  **(**
  **"fs.obs.access.key" = "** *AK* **",**
  **"fs.obs.secret.key" = "** *SK* **",**
  **"fs.obs.endpoint" = "** *obs_endpoint* **"**
  **);**
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  - *broker_name* ：表示Broker名称，可在MySQL客户端执行**show broker;**命令查看。
  
  - AK/SK：需登录MRS管理控制台，将鼠标移到右上角登录用户名处，在下拉列表中选择"我的凭证"。单击"访问密钥"，单击"新增访问密钥"，输入验证码或密码。单击"确定"，生成并下载访问密钥，在.csv文件中获取AK/SK信息。
  
  - *obs_endpoint*：表示存放导出数据的OBS并行文件系统的Endpoint。可登录OBS管理控制台，在左侧导航栏选择"并行文件系统"，单击对应的并行文件系统名称，单击"概览"，查看并记录"Endpoint"信息。
    
- 查看导出作业状态 提交作业后，可以通过以下命令查询导出作业状态：
  ```
  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：作业导出成功。  - CANCELLED：导出作业运行失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
  | 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](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_249271.html)。
 
#### 导出Doris数据至HDFS示例
执行导出任务时，可在Doris配置界面根据实际需求新增[相关配置参数]中的Export作业相关自定义参数，以提升作业导出效率。
1. 登录安装了MySQL的节点，执行以下命令，连接Doris数据库。 
   如果集群已启用Kerberos认证（安全模式），需先执行以下命令：
   ```
   export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1
   ```
   连接Doris数据库：
   ```
   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_keytab_principal}",
   "kerberos_keytab"="/home/omm/doris_keytab/doris.keytab",
   "dfs.nameservices" = "hacluster",
   "dfs.ha.namenodes.hacluster" = "37,36",
   "dfs.namenode.rpc-address.hacluster.37" = "主NameNode实例IP地址:RPC端口号",
   "dfs.namenode.rpc-address.hacluster.36" = "备NameNode实例IP地址:RPC端口号",
   "dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
   );
   ```
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   **"exec_mem_limit"="2147483648"**配置仅适用于MRS 3.6.0-LTS之前版本。
   
   
6. 执行以下命令查询导出作业状态： 
   ```
   SHOW EXPORT;
   ```
   
   
 
 #### 相关配置参数
登录FusionInsight Manager，选择"集群 \> 服务 \> Doris \> 配置 \> FE（角色） \> 自定义"，在自定义参数"fe.conf.customized.configs"中新增[表3]中的参数。
 表3Export作业相关自定义参数介绍 
| 参数                                 | 参数说明                                                              |
|:---|:---|
| 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。                           |
   
