【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.5
【问题描述】
在测试load data多客户端导入的时候遇到导入速度慢、导入的数据行数不对的问题。
具体步骤如下:
我们的环境是3台observer节点(doris9,doris10,doris21)。我把1个1G的文件(总行数为2158849)按照行数切分成4个数据文件,将data_aa,data_ad放到doris9节点,其他两个文件分别放到其他两个节点的相同目录下。
同时使用load data的方式导入数据:
LOAD DATA
/*+
parallel(64)
*/
INFILE '/data/test_data/data_1g/data_*'
INTO TABLE td_xdr_100_idc_v126
FIELDS TERMINATED BY '|'
;
doris9:
行数正确。
doris10:
doris10的所有文件总行数是719610。
行数不对。
doris21:
doris21的所有文件总行数是719610。
行数不对。
而且查看实际导入数据的行数不对,正确行数应该是2158849:
请问这是什么原因呢? 我记得未开启旁路导入的话,是支持多客户端同时导入吧?
3 个赞
论坛小助手
2025 年9 月 1 日 10:03
#4
根据您提供的测试环境和操作步骤,遇到导入速度慢、导入的数据行数不对的问题,可能的原因和解决建议如下:
数据文件的分布问题 :在您的环境中,数据文件被切分成4个文件,分别放置在3个节点上。然而,每个节点上的文件行数并不完全均匀,这可能会导致各个节点的数据导入速度不一致,从而影响整体导入速度。建议尽量平均分配数据文件的行数,避免某些节点负担过重。
并行度设置问题 :您设置了 parallel(64)
,但根据 LOAD DATA 的注意事项 ,LOAD DATA
通过并行处理技术优化数据导入速率,但每个子任务都视为独立的事务,执行顺序是不固定的。因此,不能保证数据导入过程的全局原子性,且对于没有主键的表,数据写入顺序可能与原文件中的顺序不同。建议调整并行度到合适的值,例如 parallel(4)
,以平衡导入速度和数据一致性。
网络和资源竞争 :在多客户端同时导入数据时,可能会出现网络带宽和磁盘 I/O 资源的竞争,导致导入速度变慢。建议监控各个节点的网络带宽和磁盘 I/O 使用情况,确保资源充足且没有瓶颈。
数据文件格式问题 :确保所有数据文件的格式一致,特别是字段分隔符和行结束符。任何不一致都可能导致导入失败或数据行数不对。
日志和错误检查 :检查各个节点的导入日志,查看是否有任何错误或警告信息,这些信息可能会提供更多线索。
数据文件内容检查 :确保所有数据文件的内容正确无误,特别是行数和数据格式。可以使用 wc -l
命令检查每个文件的行数。
表结构和索引 :检查目标表的结构和索引,确保没有复杂的索引或触发器影响导入性能。
综上所述,建议您首先检查数据文件的分布和格式,调整并行度设置,监控资源使用情况,并检查日志和错误信息,以找出具体原因并解决问题。
具体信息可参考以下文档:
使用 LOAD DATA 语句导入数据
使用 SQL 命令进行数据迁移
1 个赞
辞霜
2025 年9 月 1 日 11:15
#6
wc -l 查询下每个data文件行数是否符合总行数
我上述已经贴了我的4个文件的行数,data_aa,data_ab,data_ac,data_ad 加起来的总行数是2158849
,与实际导入表的行数不对
之前我验证过,直接把这个1G的文件导入数据表中的行数也是2158849,但是不知道为什么按照行数拆分几个文件,同时多客户端执行load data 操作,总数据行数不对。
辞霜
2025 年9 月 1 日 14:06
#10
相差19行,看下是不是data_ad文件也被复制到其他节点上了
辞霜
2025 年9 月 1 日 14:57
#13
是否测试过loda data 时候把文件名写全呢。怀疑另外俩节点使用data_*时候把data_ad文件复写了一遍
辞霜
2025 年9 月 1 日 15:00
#14
当前还有observer日志么,麻烦提供一份导入时候的日志
没。实际业务场景肯定是某个目录下存在多个需要导入的数据文件,使用通配符匹配的方式去导入吧?
我找到原因了,我三台服务器都是使用的 -h 172.31.6.27
这个ip,所以我在导入数据的时候都是在导入这台服务器上的数据。
不过OceanBase如果导入本地文件,不支持通配符吗?
辞霜
2025 年9 月 1 日 17:11
#19
看到了,你是在三个节点都连接的27ip走了2881端口。
不适用导入客户端本地文件
这个是关于旁路导入的说明吧?我目前的话不是使用旁路导入的方式。
我的命令如下:
LOAD DATA
/*+
parallel(64)
*/
LOCAL INFILE '/data/test_data/split_data/data_1g/data_*'
INTO TABLE xxx
FIELDS TERMINATED BY '|'
;