---
title: OBLOADER 工作原理及其常见问题-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 OBLOADER 工作原理及其常见问题相关的常见问题和使用技巧，帮助您快速解决 OBLOADER 工作原理及其常见问题的难题。
---
切换语言

- 简体中文
- English

划线反馈

# OBLOADER 工作原理及其常见问题

更新时间：2024-01-02 10:06

适用版本： V3.0.x、V3.1.x、V3.2.x、V3.3.x、V4.0.x、V4.1.x、V4.2.x 内容类型：TechNote  

## OBLOADER 工作原理

#### 说明

本篇文档仅介绍客户端模式的运行机制。

数据导入粗略分为两个阶段，预处理阶段与数据写入阶段。

- 在预处理阶段，程序会执行以下几个步骤：

     1. 查询待导入表的元数据。
     2. 筛选并匹配文件。具体请参见本篇文档中的 **OBLOADER 如何在指定目录下匹配待导入的文件？**。
     3. 对大文件进行逻辑切分。具体请参见本篇文档中的 **OBLOADER 如何执行对大文件的逻辑切分？**。
     4. 计算子文件的分区并按节点打散（导入时负载均衡）。
 - 在数据写入阶段，程序的运行机制类似一个**多生产多消费模型**。解析端作为生产者，不断从文件中解析出数据，经过数据清洗后放入 Ring Buffer；写入端作为消费者，不断从 Buffer 中提取数据，并将其写入数据库。

  ![1](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/obloaderobdumper/1300.obloader-operating-principle/1300.obloader-operating-principle.jpg)

**对于客户端而言，影响性能的主要因素分别是生产者和消费者的数量与 Buffer 的大小**，前者可以通过 `--thread` 与 [`--rw`](https://www.oceanbase.com/docs/common-oceanbase-dumper-loader-1000000000381203) 指定，后者的值由程序跟据 `--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` 选项）。

Previous

[OBLOADER 常见问题](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000486918)

Next

[如何根据业务场景选择合适的导入模式](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000486920) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
