OBLOADER 工作原理
说明
本篇文档仅介绍客户端模式的运行机制。
数据导入粗略分为两个阶段,预处理阶段与数据写入阶段。
在预处理阶段,程序会执行以下几个步骤:
查询待导入表的元数据。
筛选并匹配文件。具体请参见本篇文档中的 OBLOADER 如何在指定目录下匹配待导入的文件?。
对大文件进行逻辑切分。具体请参见本篇文档中的 OBLOADER 如何执行对大文件的逻辑切分?。
计算子文件的分区并按节点打散(导入时负载均衡)。
在数据写入阶段,程序的运行机制类似一个多生产多消费模型。解析端作为生产者,不断从文件中解析出数据,经过数据清洗后放入 Ring Buffer;写入端作为消费者,不断从 Buffer 中提取数据,并将其写入数据库。

对于客户端而言,影响性能的主要因素分别是生产者和消费者的数量与 Buffer 的大小,前者可以通过 --thread 与 --rw 指定,后者的值由程序跟据 --thread 与 JVM 最大堆内存的值综合计算得出,一般不用也不推荐手动指定,如需自定义,可以通过选项 --buffer-size (须为 2 的幂)指定。
注意
对于旁路导入,还有第三个阶段,即任务提交。在此阶段,客户端主要在等待 OBServer 对刚写入的数据进行排序和索引构建,耗时一般较长,需要耐心等待。
OBLOADER 工作原理常见问题
OBLOADER 如何在指定目录下匹配待导入的文件?
程序根据表名与文件名的对应关系去定位需要导入的文件。例如:假设目标表名为 t1,选定格式为 --csv 格式。此时默认的匹配文件后缀为 ".csv"(可以通过 --file-suffix 来自定义文件后缀),则程序会遍历 -f 指定的路径,符合该表绑定关系的文件将包括 “t1.csv”、“t1.0.csv”、 “t1.1.2.csv” 等。
若待导入的文件名有其他的规则或者无任何命名规则,应该如何解决?
您可以通过指定 --file-regular-expression 选项,通过声明一个正则表达式,去匹配待导入的文件。例如,--file-regular-expression=“.*\.csv” 表示匹配任意以 ".csv" 结尾的文件名;--file-regular-expression=“.*” 则表示匹配指定目录下的所有文件!
注意
由于您只能指定一个正则表达式,即表示该选项仅可在导入单表时使用。
OBLOADER 如何执行对大文件的逻辑切分?
注意
程序不会在磁盘上生成若干子文件,逻辑切分是指记录多个字节位点,在正式开始解析文件时,可以从一个大文件的多个字节位点去并发读取,从而提高解析速度。
每个逻辑子文件的大小由 --block-size 选项指定,默认值 64 MB。切分是基于换行符来操作,所以大多数情况下,您可以不必担心数据截断。有一种情况例外,即数据本身含有换行符(尽管出现数据截断的几率较小)。您可以通过以下方式调整文件切分策略:通过编辑器打开 <ob-loader-dumper>/bin/obloader,找到 Java 启动参数 -Dfile.split=unsafe,将其中的 unsafe 改为 safe。此时,程序会同时使用定界符与换行符来执行逻辑切分。
OBLOADER 为何要分区计算?分区计算失败会怎么样?
分区计算旨在导入数据到 OceanBase 集群时使相对负载均衡。假设原始数据文件的前三分之一属于目标表的 p1 分区,中间三分之一属于目标表的 p2 分区,以此类推。假设这三个分区的 Leader 节点不同,那么在实际导入时,总会有某一个节点的负载是直接打满的,而其他两个节点则始终空闲。
程序通过提取某个子文件的第一条数据,计算出其所属分区,并查询其 Leader 节点。并通过分组后打散的策略,使某个时刻同时处理的子文件能够尽量被转发到不同的节点,从而做到相对的负载均衡。
分区计算失败或节点查询失败不会影响实际的导入,程序会通过打印 WARN 级别日志来提示用户。使用 OBServer 4.0 之前的版本时,这可能是因为您未提供 sys 租户的帐密;使用 OBServer 4.0 及之后的版本时,则可能是因为您未提供租户名(-t 选项)。