load data多客户端导入问题(非旁路导入)

【 使用环境 】测试环境
【 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 个赞

@论坛小助手

根据您提供的测试环境和操作步骤,遇到导入速度慢、导入的数据行数不对的问题,可能的原因和解决建议如下:

  1. 数据文件的分布问题:在您的环境中,数据文件被切分成4个文件,分别放置在3个节点上。然而,每个节点上的文件行数并不完全均匀,这可能会导致各个节点的数据导入速度不一致,从而影响整体导入速度。建议尽量平均分配数据文件的行数,避免某些节点负担过重。

  2. 并行度设置问题:您设置了 parallel(64),但根据 LOAD DATA 的注意事项LOAD DATA 通过并行处理技术优化数据导入速率,但每个子任务都视为独立的事务,执行顺序是不固定的。因此,不能保证数据导入过程的全局原子性,且对于没有主键的表,数据写入顺序可能与原文件中的顺序不同。建议调整并行度到合适的值,例如 parallel(4),以平衡导入速度和数据一致性。

  3. 网络和资源竞争:在多客户端同时导入数据时,可能会出现网络带宽和磁盘 I/O 资源的竞争,导致导入速度变慢。建议监控各个节点的网络带宽和磁盘 I/O 使用情况,确保资源充足且没有瓶颈。

  4. 数据文件格式问题:确保所有数据文件的格式一致,特别是字段分隔符和行结束符。任何不一致都可能导致导入失败或数据行数不对。

  5. 日志和错误检查:检查各个节点的导入日志,查看是否有任何错误或警告信息,这些信息可能会提供更多线索。

  6. 数据文件内容检查:确保所有数据文件的内容正确无误,特别是行数和数据格式。可以使用 wc -l 命令检查每个文件的行数。

  7. 表结构和索引:检查目标表的结构和索引,确保没有复杂的索引或触发器影响导入性能。

综上所述,建议您首先检查数据文件的分布和格式,调整并行度设置,监控资源使用情况,并检查日志和错误信息,以找出具体原因并解决问题。

具体信息可参考以下文档:

  1. 使用 LOAD DATA 语句导入数据
  2. 使用 SQL 命令进行数据迁移
1 个赞

学习学习

wc -l 查询下每个data文件行数是否符合总行数

学习学习

我上述已经贴了我的4个文件的行数,data_aa,data_ab,data_ac,data_ad 加起来的总行数是2158849,与实际导入表的行数不对

之前我验证过,直接把这个1G的文件导入数据表中的行数也是2158849,但是不知道为什么按照行数拆分几个文件,同时多客户端执行load data 操作,总数据行数不对。

相差19行,看下是不是data_ad文件也被复制到其他节点上了

文件没有问题。

@AntTech_7DYPUE

是否测试过loda data 时候把文件名写全呢。怀疑另外俩节点使用data_*时候把data_ad文件复写了一遍

当前还有observer日志么,麻烦提供一份导入时候的日志

没。实际业务场景肯定是某个目录下存在多个需要导入的数据文件,使用通配符匹配的方式去导入吧?

麻烦先不用通配符,直接指定文件名试试

我找到原因了,我三台服务器都是使用的 -h 172.31.6.27这个ip,所以我在导入数据的时候都是在导入这台服务器上的数据。

不过OceanBase如果导入本地文件,不支持通配符吗?

@AntTech_HL5F31

看到了,你是在三个节点都连接的27ip走了2881端口。


不适用导入客户端本地文件

这个是关于旁路导入的说明吧?我目前的话不是使用旁路导入的方式。

我的命令如下:

LOAD DATA
/*+
  parallel(64)
*/
LOCAL INFILE '/data/test_data/split_data/data_1g/data_*'
INTO TABLE xxx
FIELDS TERMINATED BY '|'
;

学习了