Apache Flink 是一个开源的流处理框架,专为分布式、高吞吐和高性能的实时数据处理场景设计。OceanBase 官方提供了基于 JDBC 的 Flink Connector,可以在 Flink 中通过标准 JDBC 协议将数据高效写入 OceanBase,支持 MySQL 兼容模式和 Oracle 兼容模式,适用于实时数据同步、流式计算结果写入等场景。
立即试用 OceanBase 企业版,体验国产数据库能力
连接器特点
Flink Connector OceanBase(JDBC 连接器) 通过 JDBC 驱动将数据写入 OceanBase,具有以下核心特点:
- 标准 JDBC 协议:使用成熟的 JDBC 标准协议与 OceanBase 通信,兼容性好、易于集成。
- 双模式支持:同时支持 OceanBase MySQL 兼容模式和 Oracle 兼容模式。
- 灵活的驱动选择:MySQL 兼容模式下可使用 MySQL JDBC 驱动或 OceanBase JDBC 驱动,Oracle 兼容模式下使用 OceanBase JDBC 驱动。
- 连接池管理:基于 Druid 连接池,支持连接复用和参数调优。
- 批量写入优化:支持缓冲和批量提交,提升写入吞吐量。
适用场景:实时数据同步(CDC、流式计算结果写入)。
除了 JDBC 连接器,OceanBase 还提供以下连接器以满足不同场景需求:
- DirectLoad 连接器:基于旁路导入 API,适用于大批量数据导入、ETL 批处理场景。
- OBKV HBase / HBase2 连接器:基于 OBKV HBase API,适用于 HBase 兼容场景、宽表存储。
前提条件
在使用 JDBC 连接器同步数据前,请确认以下信息:
- 已安装 Apache Flink 1.15 或后续版本
- JDK 8 或以上版本
- 已准备好 OceanBase 数据库(MySQL 兼容模式或 Oracle 兼容模式)
- 已创建专用于数据写入的数据库用户,并赋予相关权限(创建表、写入数据权限)
- 已在目标 OceanBase 数据库中创建需要的表结构
关于 JDBC 驱动:根据使用的 OceanBase 模式,需要准备相应的 JDBC 驱动。
MySQL 兼容模式,可选择使用以下任一驱动:
- MySQL JDBC 驱动(推荐使用 MySQL Connector/J 8.0 或以上版本)
- OceanBase JDBC 驱动
- 将下载的驱动 JAR 文件放入 Flink 的 lib 目录下。
Oracle 兼容模式(OceanBase 数据库企业版)必须使用 OceanBase JDBC 驱动:
- 依赖名称:com.oceanbase:oceanbase-client:2.4.9
- 下载地址:https://mvnrepository.com/artifact/com.oceanbase/oceanbase-client
- 将驱动 JAR 文件放入 Flink 的 lib 目录下
操作步骤
步骤一:下载并部署 JDBC 连接器
1.下载基于 JDBC 的连接器 JAR 包 flink-sql-connector-oceanbase-${version}.jar:
2.将 JAR 文件复制到 Flink 的 lib 目录:
# 假设下载的文件在当前目录,FLINK_HOME 是 Flink 安装目录
cp flink-sql-connector-oceanbase-1.3.0.jar $FLINK_HOME/lib/
步骤二:准备并部署 JDBC 驱动
根据您使用的 OceanBase 模式,下载并放置相应的 JDBC 驱动。
MySQL 兼容模式可选择使用以下任一驱动:
-
MySQL JDBC 驱动(推荐 8.0 或以上版本)
-
OceanBase JDBC 驱动,将下载的驱动 JAR 文件放入 Flink 的 lib 目录:
示例:复制 MySQL JDBC 驱动
cp mysql-connector-j-8.0.33.jar $FLINK_HOME/lib/
Oracle 兼容模式必须使用 OceanBase JDBC 驱动。
-
下载地址:https://mvnrepository.com/artifact/com.oceanbase/oceanbase-client
-
选择最新版本(例如:2.4.9)下载 JAR 文件
复制 OceanBase JDBC 驱动
cp oceanbase-client-2.4.9.jar $FLINK_HOME/lib/
步骤三:启动 Flink 集群
部署完连接器和驱动后,启动 Flink 集群:
# 进入 Flink 安装目录
cd $FLINK_HOME
# 启动 Flink 集群(包括 JobManager 和 TaskManager)
./bin/start-cluster.sh
启动成功后,您可以访问 Flink Web UI 验证集群状态:
- 默认地址:http://localhost:8081
- 您应该能看到 JobManager 和至少一个 TaskManager 正在运行
如果启动失败,可以检查日志:
# 查看 JobManager 日志
tail -f $FLINK_HOME/log/flink-*-standalonesession-*.log
# 查看 TaskManager 日志
tail -f $FLINK_HOME/log/flink-*-taskexecutor-*.log
步骤四:在 OceanBase 中准备目标表
在 OceanBase 数据库 MySQL 兼容模式下的 test 库中创建目的表 t_sink。
USE test;
CREATE TABLE `t_sink`
(
`id` int(10) NOT NULL,
`username` varchar(20) DEFAULT NULL,
`score` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
);
步骤五:启动 Flink SQL Client
使用 SQL Client 来执行 SQL 语句并写入数据:
# 进入 Flink 安装目录(如果还未在该目录)
cd $FLINK_HOME
# 启动 SQL Client
./bin/sql-client.sh
成功启动后,您将看到 Flink SQL Client 的交互式命令行界面:
▒▓██▓██▒
▓████▒▒█▓▒▓███▓▒
▓███▓░░ ▒▒▒▓██▒ ▒
░██▒ ▒▒▓▓█▓▓▒░ ▒████
██▒ ░▒▓███▒ ▒█▒█▒
░▓█ ███ ▓░▒██
▓█ ▒▒▒▒▒▓██▓░▒░▓▓█
█░ █ ▒▒░ ███▓▓█ ▒█▒▒▒
████░ ▒▓█▓ ██▒▒▒ ▓███▒
░▒█▓▓██ ▓█▒ ▓█▒▓██▓ ░█░
▓░▒▓████▒ ██ ▒█ █▓░▒█▒░▒█▒
███▓░██▓ ▓█ █ █▓ ▒▓█▓▓█▒
░██▓ ░█░ █ █▒ ▒█████▓▒ ██▓░▒
███░ ░ █░ ▓ ░█ █████▒░░ ░█░▓ ▓░
██▓█ ▒▒▓▒ ▓███████▓░ ▒█▒ ▒▓ ▓██▓
▒██▓ ▓█ █▓█ ░▒█████▓▓▒░ ██▒▒ █ ▒ ▓█▒
▓█▓ ▓█ ██▓ ░▓▓▓▓▓▓▓▒ ▒██▓ ░█▒
▓█ █ ▓███▓▒░ ░▓▓▓███▓ ░▒░ ▓█
██▓ ██▒ ░▒▓▓███▓▓▓▓▓██████▓▒ ▓███ █
▓███▒ ███ ░▓▓▒░░ ░▓████▓░ ░▒▓▒ █▓
█▓▒▒▓▓██ ░▒▒░░░▒▒▒▒▓██▓░ █▓
██ ▓░▒█ ▓▓▓▓▒░░ ▒█▓ ▒▓▓██▓ ▓▒ ▒▒▓
▓█▓ ▓▒█ █▓░ ░▒▓▓██▒ ░▓█▒ ▒▒▒░▒▒▓█████▒
██░ ▓█▒█▒ ▒▓▓▒ ▓█ █░ ░░░░ ░█▒
▓█ ▒█▓ ░ █░ ▒█ █▓
█▓ ██ █░ ▓▓ ▒█▓▓▓▒█░
█▓ ░▓██░ ▓▒ ▓█▓▒░░░▒▓█░ ▒█
██ ▓█▓░ ▒ ░▒█▒██▒ ▓▓
▓█▒ ▒█▓▒░ ▒▒ █▒█▓▒▒░░▒██
░██▒ ▒▓▓▒ ▓██▓▒█▒ ░▓▓▓▓▒█▓
░▓██▒ ▓░ ▒█▓█ ░░▒▒▒
▒▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓ ▓░▒█░
______ _ _ _ _____ ____ _ _____ _ _ _ BETA
| ____| (_) | | / ____|/ __ \| | / ____| (_) | |
| |__ | |_ _ __ | | __ | (___ | | | | | | | | |_ ___ _ __ | |_
| __| | | | '_ \| |/ / \___ \| | | | | | | | | |/ _ \ '_ \| __|
| | | | | | | | < ____) | |__| | |____ | |____| | | __/ | | | |_
|_| |_|_|_| |_|_|\_\ |_____/ \___\_\______| \_____|_|_|\___|_| |_|\__|
Welcome! Enter 'HELP;' to list all available commands. 'QUIT;' to exit.
Flink SQL>
现在您可以在 SQL Client 中执行 SQL 语句了。
步骤六:配置 JDBC 连接并写入数据
方式一:MySQL 兼容模式
在 SQL Client 中创建 Flink 目的表,映射到 OceanBase 的 t_sink 表:
CREATE TABLE t_sink
(
id INT,
username VARCHAR,
score INT,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'oceanbase',
'url' = 'jdbc:mysql://127.0.0.1:2881/test',
'schema-name' = 'test',
'table-name' = 't_sink',
'username' = 'root@test#obcluster',
'password' = 'pswd',
'druid-properties' = 'druid.initialSize=10;druid.maxActive=100;',
'buffer-flush.interval' = '1s',
'buffer-flush.buffer-size' = '5000',
'max-retries' = '3'
);
配置说明:
- url:OceanBase 的 JDBC 连接地址,格式为 jdbc:mysql://host:port/database
- schema-name 和 table-name:目标数据库和表名
- username 和 password:OceanBase 数据库用户名和密码
- 其他参数用于调优性能和可靠性
创建表成功后,插入测试数据:
INSERT INTO t_sink
VALUES (1, 'Tom', 99),
(2, 'Jerry', 88),
(1, 'Tom', 89);
执行成功后,您将看到类似如下的输出:
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:
Job ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
步骤七:验证数据写入
在 OceanBase 数据库中查询验证数据是否成功写入:
-- 连接到 OceanBase MySQL 兼容模式
mysql -h127.0.0.1 -P2881 -uroot@test#obcluster -p
-- 查询数据
USE test;
SELECT * FROM t_sink;
预期结果:
+----+----------+-------+
| id | username | score |
+----+----------+-------+
| 1 | Tom | 89 |
| 2 | Jerry | 88 |
+----+----------+-------+
2 rows in set
说明:
- 由于主键冲突,id=1 的记录会被更新为最新的值(Tom, 89)
- 连接器通过 JDBC 协议与 OceanBase 通信,使用标准的 UPSERT 语义
方式二:Oracle 兼容模式
对于 OceanBase 数据库企业版的 Oracle 兼容模式,需要指定 OceanBase JDBC 驱动对应的 url 和 driver-class-name。
在 SQL Client 中执行:
CREATE TABLE t_sink
(
id INT,
username VARCHAR,
score INT,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'oceanbase',
'url' = 'jdbc:oceanbase://127.0.0.1:2881/SYS',
'driver-class-name' = 'com.oceanbase.jdbc.Driver',
'schema-name' = 'SYS',
'table-name' = 'T_SINK',
'username' = 'SYS@test#obcluster',
'password' = 'pswd',
'druid-properties' = 'druid.initialSize=10;druid.maxActive=100;',
'buffer-flush.interval' = '1s',
'buffer-flush.buffer-size' = '5000',
'max-retries' = '3'
);
Oracle 模式配置要点:
- url:使用 jdbc:oceanbase:// 协议
- driver-class-name:必须指定为 com.oceanbase.jdbc.Driver
- schema-name 和 table-name:Oracle 模式下通常使用大写
插入测试数据:
INSERT INTO t_sink
VALUES (1, 'Tom', 99),
(2, 'Jerry', 88),
(1, 'Tom', 89);
验证数据写入:
-- 连接到 OceanBase Oracle 兼容模式
obclient -h127.0.0.1 -P2881 -uSYS@test#obcluster -p
-- 查询数据
SELECT * FROM T_SINK;
步骤八:关闭和清理(可选)
完成测试后,您可以停止 Flink 集群:
# 停止 Flink 集群
cd $FLINK_HOME
./bin/stop-cluster.sh
在 SQL Client 中退出:
-- 在 SQL Client 中执行
QUIT;
JDBC 连接器配置说明
以下是 JDBC 连接器的主要配置项。
| 参数名 | 必需 | 默认值 | 类型 | 描述 |
|---|---|---|---|---|
| url | 是 | - | String | 数据库的 JDBC url |
| username | 是 | - | String | 连接用户名 |
| password | 是 | - | String | 连接密码 |
| schema-name | 是 | - | String | 连接的 schema 名或 db 名 |
| table-name | 是 | - | String | 表名 |
| driver-class-name | 否 | com.mysql.cj.jdbc.Driver | String | JDBC 驱动类名。MySQL 兼容模式可使用 'com.mysql.cj.jdbc.Driver'(默认值)或 'com.oceanbase.jdbc.Driver',Oracle 兼容模式必须使用 'com.oceanbase.jdbc.Driver' |
| druid-properties | 否 | - | String | Druid 连接池属性,多个值用分号分隔 |
| sync-write | 否 | false | Boolean | 是否开启同步写,设置为 true 时将不使用 buffer 直接写入数据库 |
| buffer-flush.interval | 否 | 1s | Duration | 缓冲区刷新周期。设置为 '0' 时将关闭定期刷新 |
| buffer-flush.buffer-size | 否 | 1000 | Integer | 缓冲区大小 |
| max-retries | 否 | 3 | Integer | 失败重试次数 |
| memstore-check.enabled | 否 | true | Boolean | 是否开启内存检查 |
| memstore-check.threshold | 否 | 0.9 | Double | 内存使用的阈值相对最大限制值的比例 |
| memstore-check.interval | 否 | 30s | Duration | 内存使用检查周期 |
| partition.enabled | 否 | false | Boolean | 是否启用分区计算功能,按照分区来写数据。仅当 'sync-write' 和 'direct-load.enabled' 都为 false 时生效 |
说明:该连接器基于 JDBC 协议,通过 Druid 连接池管理数据库连接。
使用场景
实时数据同步
基于 JDBC 连接器进行实时数据写入,利用异步批量写入的优势提升吞吐量。JDBC 连接器通过内置的缓冲机制,将多条记录批量提交到 OceanBase,适合持续的实时数据流写入。
典型应用场景
- 与 CDC 结合的数据库同步。
JDBC 连接器可以与 CDC 数据源(如 MySQL CDC)结合使用,进行数据库之间的实时同步。JDBC 连接器作为 Sink 端,通过标准 JDBC 协议将 CDC 捕获的变更数据写入 OceanBase。
- 流式计算结果写入。
将 Flink 流式计算的结果实时写入 OceanBase,支持复杂的数据处理和转换。
- 实时业务数据同步。
持续同步业务系统的数据变更到 OceanBase,用于数据仓库实时更新、实时报表等场景。
最佳实践
- 调整并行度提升性能。
通过调整 Flink 任务的并行度可以显著提升写入性能。并行度越高,同时写入 OceanBase 的连接数越多,吞吐量越大。
设置方式: 在 Flink SQL Client 中设置全局并行度:
SET 'parallelism.default' = '8';
并行度调优建议:
- 根据数据量和 OceanBase 集群性能合理设置并行度。
- 监控 OceanBase 的负载情况,避免写入压力过大。
- 批量写入性能优化。
调整 buffer-flush.buffer-size 和 buffer-flush.interval 参数以平衡延迟和吞吐量:
- buffer-flush.buffer-size:缓冲区大小,默认 1000 条。
- buffer-flush.interval:缓冲区刷新周期,默认 1s。
高吞吐场景可适当增大 buffer-size 和延长 interval。
- 可靠性保障。
- 配置 max-retries 参数控制失败重试次数(默认 3 次)。
- 启用 memstore-check.enabled 避免 OceanBase 内存溢出(默认开启)。
- 使用 sync-write=true 可确保数据实时可见性,但会牺牲性能(每条记录直接通过 JDBC 提交)。
- 监控建议。
- 监控 Flink 任务的背压情况,及时发现性能瓶颈。
- 关注 OceanBase 的写入性能指标(TPS、QPS、响应时间等)。
- 监控各并行任务的数据倾斜情况,确保负载均衡。
连接器选型参考
OceanBase 提供多种 Flink 连接器以满足不同场景需求。
| 连接器类型 | 协议/技术 | 适用场景 |
|---|---|---|
| JDBC 连接器(本文) | JDBC 协议 | 实时数据同步、流式计算结果写入 |
| DirectLoad 连接器 | 旁路导入 API | 大批量数据导入、ETL 批处理场景 |
| OBKV HBase / HBase2 | OBKV HBase API | HBase 兼容场景、宽表存储 |
选型建议:
- 如需实时写入、事务支持、标准 SQL 表结构,推荐使用 JDBC 连接器。
- 如需高吞吐批量导入,推荐使用 DirectLoad 连接器。
- 如需兼容 HBase API 或宽表场景,推荐使用 OBKV HBase 连接器。
参考信息
- GitHub 仓库:https://github.com/oceanbase/flink-connector-oceanbase
- 连接器下载:https://repo1.maven.org/maven2/com/oceanbase/flink-sql-connector-oceanbase/
- 详细文档:https://github.com/oceanbase/flink-connector-oceanbase/tree/main/docs
- 社区支持:https://ask.oceanbase.com
- 立即试用 OceanBase 企业版,体验国产数据库能力