Apache Doris 02|导入数据遇到的问题

本文介绍了使用BrokerLoad从HDFS导入数据到数据库时遇到的问题及解决方案,包括因端口配置错误导致的连接失败和数据质量问题引发的导入失败。通过调整端口和明确数据格式,最终实现了数据的成功导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、broker load 数据导入失败

load label example_db.stuscore (data infile ("hdfs://devtest4.com:50070/tmp/testdata/stuscore.txt") into table stuscore) with broker 'broker_name' ("username"="root","password"="");

查看数据导入状态。

show load order by createtime desc limit 1\G

ErrorMsg: type:ETL_RUN_FAIL; msg:errCode = 2, detailMessage = Broker list path failed. path=hdfs://devtest4.com:50075/tmp/test1/tabledata1,broker=TNetworkAddress(hostname:192.168.11.37, port:8000),msg=unknown error when get file status, cause by: Call From devtest1.com/192.168.11.37 to devtest4.com:50075 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

显示数据路径失败,连接拒绝。先查看hdfs使用的端口是不是50070

#获取端口号
hdfs getconf -confKey fs.default.name
#查看文件列表
hdfs dfs -ls hdfs://devtest4.com:8020/

真的是端口问题呀。再次执行

load label example_db.stuscore (data infile ("hdfs://devtest4.com:8020/tmp/testdata/stuscore.txt") into table stuscore) with broker 'broker_name' ("username"="root","password"="");

 出现ErrorMsg: type:ETL_QUALITY_UNSATISFIED; msg:quality not good enough to cancel

数据质量问题,指定数据的分隔符,插入列等信息。使用desc table1 查看数据列字段。

LOAD LABEL example_db.stuscore01 ( DATA INFILE("hdfs://devtest4.com:8020/tmp/testdata/stuscore.txt") INTO TABLE stuscore COLUMNS TERMINATED BY "," (id,name,score) SET (id=id,name=name,score=score)) WITH BROKER 'broker_name' ("username"="root","password"="") PROPERTIES ("timeout" = "3600");

State: FINISHED。数据导入成功。
 

2、因为数据质量问题导入不成功

使用steam load方式导入,在导入时设置max_filter_ratio,默认是零容忍错误导入。

curl --location-trusted -u root  -H "label:bigtable20210617_01" -H "column_separator:\t" -H "max_filter_ratio:0.9" -T bigtable http://devtest1.com:18030/api/example_db/bigtable/_stream_load
 

### 解决Doris数据库中多次插入数据问题 在处理Doris数据库中的重复插入问题时,可以采取多种策略来确保数据的一致性和准确性。以下是几种常见的方法: #### 使用唯一键约束防止重复记录 如果表结构允许定义主键或其他类型的唯一索引,则可以在创建表时指定这些字段作为唯一键。当尝试向具有相同唯一键值的现有行再次插入新行时,操作将会失败并抛出错误。 ```sql CREATE TABLE example_table ( id BIGINT NOT NULL, name STRING, PRIMARY KEY (id) ); ``` 这有助于避免无意间引入冗余的数据条目[^1]。 #### 利用Merge Into语法更新已有数据 对于那些已经存在但需要被覆盖或部分更改的情况,`MERGE INTO`语句提供了一种优雅的方式来进行条件性的插入和更新动作。它会先查找目标表内是否存在匹配的关键字;如果有则执行相应的UPDATE子句,反之则触发INSERT逻辑。 ```sql MERGE INTO target_table t USING source_table s ON t.key = s.key WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT VALUES (...); ``` 此功能自Apache Doris 1.2版本起支持。 #### 配置Flink作业以减少重试期间产生的多余副本 考虑到流计算框架如Flink可能会因为网络波动等原因造成任务重启进而引发多份相同的事件被发送至下游存储系统的情形下,合理调整Flink配置项以及利用其内置特性(比如exactly-once语义保障)能够有效降低此类风险的发生概率。具体来说,保持较短而稳定的checkpoint间隔可以帮助缩短最大可能存在的滞后窗口长度,并且开启两阶段提交协议可进一步增强事务的安全级别[^2]。 #### Stream Load接口下的去重措施 由于Stream Load是以HTTP请求的形式与Doris建立联系完成批量加载工作的,在某些特殊场景里也可能遇到重复投递文件的现象。为了避免这种情况带来的负面影响,建议设置合适的标签(`label`)参数用于标识每一次导入批次,从而让服务端可以根据该标记判断是否接受当前传输过来的新资料包。另外还可以考虑启用全局唯一的UUID作为每笔交易的身份证明附加到URL路径后面传递给接收方校验使用[^3]。 ```bash curl --location-trusted -u root: \ -H "format: json" \ -H "strip_outer_array: true" \ -H "columns: k1,k2,v1,v2" \ -H "max_filter_ratio: 0.1" \ --data-binary @/path/to/file.json \ "http://<fe_host>:<http_port>/api/<db_name>/<table_name>/_stream_load?label=<unique_label>" ``` 以上便是针对Doris数据库中存在的多次插入现象所提出的若干应对方案和技术手段介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值