Kafka Connect Debezium MySQL源连接器如何消除消息Key中的Struct{}结构
你使用的Flatten SMT仅能将嵌套的Struct结构扁平化生成带层级分隔符的字段名(例如将Struct{user=Struct{id=1}}转换为Struct{user.id=1}),无法将单字段Struct直接转换为对应的标量值,因此配置后不生效。Debezium默认会将所有主键(即使是单字段主键)封装为Struct结构输出,才会导致下游Sink读取到Struct{id=x}格式的异常值。
解决方案
按实现成本从低到高推荐如下两种方案:
方案1:使用Debezium内置配置(推荐,适配Debezium 1.9及以上版本)
直接在源连接器配置中添加如下参数即可,无需额外引入SMT,适配多表同步、单/多主键场景:
key.force.struct=false
该配置开启后,Debezium会自动判断主键字段数量:单字段主键直接返回标量值作为消息Key,多字段主键保留Struct封装。
方案2:使用ExtractField SMT提取主键值(适配所有Debezium版本,仅适用单主键单表同步场景)
替换你之前配置的Flatten SMT为如下配置即可:
transforms=extractPrimaryKey transforms.extractPrimaryKey.type=org.apache.kafka.connect.transforms.ExtractField$Key # 此处填写你的表主键字段名 transforms.extractPrimaryKey.field=id
配置验证与下游适配
配置更新后可通过Kafka自带的控制台消费者验证消息Key格式是否符合预期:
kafka-console-consumer.sh --bootstrap-server <Kafka集群地址> --topic <对应业务Topic名称> --from-beginning --property print.key=true
正常输出的消息Key应为1这类纯数值,而非Struct结构。
同时需要确认下游Sink连接器的pk.mode配置为record_key,确保Sink直接读取消息Key作为目标表的主键值。
内容的提问来源于stack exchange,提问作者felicienb
相关产品推荐
相关产品推荐

