Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我使用相同的密钥时,Kafka JDBC connect不会将消息发布到一个分区_Jdbc_Apache Kafka_Apache Kafka Connect_Confluent Platform - Fatal编程技术网

当我使用相同的密钥时,Kafka JDBC connect不会将消息发布到一个分区

当我使用相同的密钥时,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 模式=递增

具有相同密钥的消息应转到主题的同一分区,但Kafka JDBC源连接器正在将消息发布到不同分区

我创建了一个有5个分区的主题(中的学生主题)

我使用以下脚本创建了一个学生表:

创建学生表(
标准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