导出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" );
主备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”。
- 集群已启用Kerberos认证(安全模式)
- 查看导出作业状态
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后,创建具有管理员权限的角色并绑定给用户。
- 集群已启用Kerberos认证(安全模式)
- 已安装MySQL客户端,相关操作可参考使用MySQL客户端连接Doris。
导出Doris数据至HDFS示例
执行导出任务时,可在Doris配置界面根据实际需求新增相关配置参数中的Export作业相关自定义参数,以提升作业导出效率。
- 登录安装了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界面连接数据库。
- 执行以下命令创建数据库:
create database if not exists example_db;
- 执行以下命令创建表:
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;
- 执行以下命令插入数据:
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");
- 执行以下命令导出“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" );
- 执行以下命令查询导出作业状态:
SHOW EXPORT;
相关配置参数
登录FusionInsight Manager,选择“集群 > 服务 > Doris > 配置 > FE(角色) > 自定义”,在自定义参数“fe.conf.customized.configs”中新增表3中的参数。
参数 |
参数说明 |
---|---|
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。 |