流计算 Oceanus 数据库 MongoDB CDC

MongoDB 的 CDC 源表(即 MongoDB 的流式源表),基于开源社区实现。Connector 会自动跟踪 MongoDB 副本集或分片集群,以获取数据库和集合中的文档更改。

相关产品
流计算 Oceanus 产品页,含版本规格、价格与购买入口。

一、版本说明

Flink 版本 说明
1.13 支持基于开源 release-2.2版本
1.14 支持基于开源 release-2.2版本
1.16 支持基于开源 release-2.2版本
1.18 支持基于开源 release-2.4版本
1.20 支持基于开源 release-3.4版本

二、使用范围

MongoDB CDC 只支持作为源表,MongoDB CDC 支持4.0、4.2、5.0版本,MongoDB 集群必须是副本集或者分片集群。

三、DDL 定义

— register a MongoDB table 'products' in Flink SQLCREATE TABLE mongo_cdc_source_table ( _id STRING, // must be declared name STRING, weight DECIMAL(10,3), tags ARRAY<STRING>, — array price ROW<amount DECIMAL(10,2), currency STRING>, — embedded document suppliers ARRAY<ROW<name STRING, address STRING>>, — embedded documents PRIMARY KEY(_id) NOT ENFORCED) WITH ( 'connector' = 'mongodb-cdc', 'hosts' = 'localhost:27017,localhost:27018,localhost:27019', 'username' = 'flinkuser', 'password' = 'flinkpw', 'database' = 'inventory', 'collection' = 'products');

四、WITH 参数

参数 说明 是否必填 备注
connector 源表类型 是 固定值为 mongodb-cdc
hosts MongoDB 数据库的 IP 端口对 是 –
username MongoDB 数据库服务的用户名 是 –
password MongoDB 数据库服务的密码 是 –
database MongoDB 数据库名称 是 正则表达式下要求 MongoDB 4.0版本及以上
collection MongoDB Collection 名称 是 正则表达式下要求 MongoDB 4.0版本及以上,且表达式中必须包含数据库名称,例如要包含 default 库中所有"test_"开头的表,需要配置为"default.test_.*"。
filter-duplicate-pair-records 过滤未在 Flink DDL 语句中定义的源表字段变更记录 否 例如 MongoDB 源表有 a, b, c, d 四个字段,而用户在 Flink SQL 建表时只定义了 a, b 两个字段;开启该参数后,仅涉及 c 或 d 字段的变更记录会被忽略,不会输出到下游,可减少计算量和处理压力
connection.options MongoDB 的 连接选项。有多个时,使用&连接,例如 replicaSet=test&connectTimeoutMS=300000 否 –
errors.tolerance 是否忽略错误记录,接受 none 或者 all。如果设置为 all, 忽略错误记录 否 none
errors.log.enable 是否需要把错误操作打印到日志文件 否 默认值为 true
copy.existing 是否复制库中原有的数据,如果在复制期间对数据有更改,会在数据复制完成后应用更改 否 默认值为 true
copy.existing.pipeline 当复制原有数据的时候,可以通过这个参数设置筛选条件。例如[{"$match": {"closed": "false"}}],只会复制 closed 为 false 的 记录。用法参考 $match (aggregation) 否 –
copy.existing.max.threads 执行数据复制时要使用的线程数 否 默认值为 Processors Count
copy.existing.queue.size 复制数据时要使用的队列的最大大小 否 默认值为16000
poll.max.batch.size 每次拉取数据的最大数量。默认情况下,1.5秒的拉取间隔下,最多拉取1000条变更数据 否 默认值为1000
poll.await.time.ms 拉取数据的时间间隔。默认情况下,1.5秒的拉取间隔下,最多拉取1000条变更数据 否 默认值为1500
heartbeat.interval.ms 发送心跳消息时间间隔,以毫秒为单位。使用0禁用 否 默认值为0

注意:Note:当数据流变化慢的时候,建议把 heartbeat.interval.ms 设置为一个合适的值,心跳会推送 resumeToken,防止当 Flink job 从 checkpoint 或者 savepoint 恢复的时候,resumeToken 已经过期。

五、类型映射

MongoDB 字段类型 Flink 字段类型
– TINYINT
– SMALLINT
Int INT
Long BIGINT
– FLOAT
Double DOUBLE
Decimal128 DECIMAL(p, s)
Boolean BOOLEAN
DateTimestamp DATE
DateTimestamp TIME
Date TIMESTAMP(3)TIMESTAMP_LTZ(3)
Timestamp TIMESTAMP(0)TIMESTAMP_LTZ(0)
StringObjectIdUUIDSymbol MD5 JavaScriptRegex STRING
BinData BYTES
Object ROW
ARRAY ARRAY
DBPointer ROW<$ref STRING, $id STRING>
GeoJSON Point : ROW<type STRING, coordinates ARRAY<DOUBLE>> Line : ROW<type STRING, coordinates ARRAY<ARRAY< DOUBLE>>> …

六、代码示例

CREATE TABLE mongo_cdc_source_table ( _id STRING, // must be declared name STRING, weight DECIMAL(10,3), tags ARRAY<STRING>, — array price ROW<amount DECIMAL(10,2), currency STRING>, — embedded document suppliers ARRAY<ROW<name STRING, address STRING>>, — embedded documents PRIMARY KEY(_id) NOT ENFORCED) WITH ( 'connector' = 'mongodb-cdc', 'hosts' = 'localhost:27017,localhost:27018,localhost:27019', 'username' = 'flinkuser', 'password' = 'flinkpw', 'database' = 'inventory', 'collection' = 'products');CREATE TABLE `print_table` ( `id` STRING, `name` STRING, `currency` STRING) WITH ( 'connector' = 'print');insert into print_table select _id, name, price.currency from mongo_cdc_source_table;

七、用户权限

MongoDB 的 User 必须有 changeStream 和 read 权限。

use admin; db.createUser( { user: "flinkuser", pwd: "flinkpw", roles: [ { role: "read", db: "admin" }, { role: "readAnyDatabase", db: "admin" } ] });

八、并行度

任务的并行度只支持1。

九、ChangelogNormalize 算子

mongodb 的 Update 操作在 change stream 中目前只能捕获更新后的文档,Flink 会自动注入 ChangelogNormalize 算子,补齐 UPDATE BEFORE 信息。该算子会导致状态文件膨胀,影响同步速度。如果该算子对作业造成了较大影响,建议配置 state ttl 缓解。

赞 (0)
上一篇 4天前
下一篇 4天前