当我使用相同的密钥时,Kafka JDBC connect不会将消息发布到一个分区
具有相同密钥的消息应转到主题的同一分区,但Kafka JDBC源连接器正在将消息发布到不同分区 我创建了一个有5个分区的主题(中的学生主题) 我使用以下脚本创建了一个学生表:当我使用相同的密钥时,Kafka JDBC connect不会将消息发布到一个分区,jdbc,apache-kafka,apache-kafka-connect,confluent-platform,Jdbc,Apache Kafka,Apache Kafka Connect,Confluent Platform,具有相同密钥的消息应转到主题的同一分区,但Kafka JDBC源连接器正在将消息发布到不同分区 我创建了一个有5个分区的主题(中的学生主题) 我使用以下脚本创建了一个学生表: 创建学生表( 标准id INT自动增量主键, 标准名称VARCHAR(50), 类别名称VARCHAR(50), 父亲叫瓦查尔(50岁), 母亲的名字叫瓦查尔(50岁), 瓦查尔学校(50) ); 我的JDBC源代码快速启动属性文件如下 query=select*from student task.max=1 模式=递增
创建学生表(
标准id INT自动增量主键,
标准名称VARCHAR(50),
类别名称VARCHAR(50),
父亲叫瓦查尔(50岁),
母亲的名字叫瓦查尔(50岁),
瓦查尔学校(50)
);
我的JDBC源代码快速启动属性文件如下
query=select*from student
task.max=1
模式=递增
递增的.column.name=std\u id
topic.prefix=中的学生主题
数值映射=最佳拟合
timestamp.delay.interval.ms=10
transforms=CreateKey、ExtractKey、ConvertDate、Replace、InsertPartition、InsertTopic
transforms.CreateKey.type=org.apache.kafka.connect.transforms.ValueToKey
transforms.CreateKey.fields=类\名称
transforms.ExtractKey.type=org.apache.kafka.connect.transforms.ExtractField$Key
transforms.ExtractKey.field=类名称
当我在DB表中插入相同的类学生详细信息时,所有消息都发布到一个分区
学生主题在3“15”@35:{“std_id”:145,“std_name”:“pranavi311”,“class_name”:“15”,“父亲姓名”:“abcd1”,“母亲姓名”:“efgh1”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“15”@36:{“std_id”:146,“std_name”:“pranavi321”,“class_name”:“15”,“父亲姓名”:“abcd2”,“母亲姓名”:“efgh2”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“15”@37:{“std_id”:147,“std_name”:“pranavi331”,“class_name”:“15”,“父亲姓名”:“abcd3”,“母亲姓名”:“efgh3”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“15”@38:{“std_id”:148,“std_name”:“pranavi341”,“class_name”:“15”,“父亲名”:“abcd4”,“母亲名”:“efgh4”,“学校名”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“15”@39:{“std_id”:149,“std_name”:“pranavi351”,“class_name”:“15”,“父亲姓名”:“abcd5”,“母亲姓名”:“efgh5”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“15”@40:{“std_id”:150,“std_name”:“pranavi361”,“class_name”:“15”,“父亲姓名”:“abcd6”,“母亲姓名”:“efgh6”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
%在偏移量41处到达[3]中学生主题的结尾
但是,如果我插入不同的类学生详细信息,它仍然会发布到一个分区
学生主题在3“11”@41:{“std_id”:151,“std_name”:“pranavi311”,“class_name”:“11”,“父名”:“abcd1”,“母名”:“efgh1”,“学校名”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“12”@42:{“std_id”:152,“std_name”:“pranavi321”,“class_name”:“12”,“父亲姓名”:“abcd2”,“母亲姓名”:“efgh2”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“13”@43:{“std_id”:153,“std_name”:“pranavi331”,“class_name”:“13”,“父亲姓名”:“abcd3”,“母亲姓名”:“efgh3”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“14”@44:{“std_id”:154,“std_name”:“pranavi341”,“class_name”:“14”,“父亲姓名”:“abcd4”,“母亲姓名”:“efgh4”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在3“15”@45:{“std_id”:155,“std_name”:“pranavi351”,“class_name”:“15”,“父亲姓名”:“abcd5”,“母亲姓名”:“efgh5”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
学生主题在0“16”@31:{“std_id”:156,“std_name”:“pranavi361”,“class_name”:“16”,“父亲姓名”:“abcd6”,“母亲姓名”:“efgh6”,“学校名称”:“CSI”,“分区”:null,“主题”:“学生主题在”}
%在偏移量46处到达[3]中学生主题的结尾
我正在使用下面的命令打印详细信息
kafkacat-b localhost:9092-C-t学生主题在-f“%t%p%k@%o:%s\n”
我的期望是,每个类学生的消息都应该发布到一个特定的分区(在JDBC连接器中,我将class_名称指定为键),但它不起作用
我到底错过了什么?如何将每个班级的学生发布到特定分区?我通过使用字符串转换器
key.converter=org.apache.kafka.connect.storage.StringConverter
解决了这个问题,在您的例子中,我使用字符串转换器key.converter=org.apache.kafka.connect.storage.StringConverter
解决了这个问题工作正常
如果您检查Kafka Connect源代码,您可以在WorkerSourceTask::sendRecords
方法中看到,在生产者发送之前,对每个记录应用转换,然后通过转换器将消息转换为字节数组
private boolean sendRecords(){
...
最终SourceRecord=transformationChain.apply(预传输记录);
最终产品记录产品记录=转换后的记录(记录);
...
}
在您的例子中,转换是:CreateKey、ExtractKey、ConvertDate、Replace、InsertPartition、InsertTopic
,而转换器是org.apache.kafka.connect.json.JsonConverter
转换器使用模式将密钥映射到字节数组,即发送到Kafka
@覆盖
ConnectData的公共字节[](字符串主题、架构、对象值){
JsonNode jsonValue=enableSchemas?convertToJsonWithEnvelope(模式,值):convertToJsonWithoutEnvelope(模式,值);
试一试{
返回serializer.serialize(主题,jsonValue);
}捕获(序列化异常){
抛出新的DataException(“由于序列化错误,将Kafka Connect数据转换为字节[]失败:”,e);
}
}
您已禁用架构,因此对于键,以下调用结果为:
- 11
serializer.serialize(主题,新文本节点(“11”))
=[34,49,49,34]
- 12
serializ