Java 无法以AVRO格式从卡夫卡制作人发送GenericRecord数据
使用confluent-oss-5.0.0-2.11 我的卡夫卡制作人代码是Java 无法以AVRO格式从卡夫卡制作人发送GenericRecord数据,java,apache-kafka,avro,kafka-producer-api,confluent-schema-registry,Java,Apache Kafka,Avro,Kafka Producer Api,Confluent Schema Registry,使用confluent-oss-5.0.0-2.11 我的卡夫卡制作人代码是 public class AvroProducer { public static void main(String[] args) throws ExecutionException, InterruptedException { Properties props = new Properties(); props.put("bootstrap.servers", "localho
public class AvroProducer {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("ZOOKEEPER_HOST", "localhost");
//props.put("acks", "all");
props.put("retries", 0);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
props.put("schema.registry.url", "http://localhost:8081");
String topic = "confluent-new";
Schema.Parser parser = new Schema.Parser();
// I will get below schema string from SCHEMA REGISTRY
Schema schema = parser.parse("{\"type\":\"record\",\"name\":\"User\",\"fields\":[{\"name\":\"userName\",\"type\":\"string\"},{\"name\":\"uID\",\"type\":\"string\"},{\"name\":\"company\",\"type\":\"string\",\"default\":\"ABC\"},{\"name\":\"age\",\"type\":\"int\",\"default\":0},{\"name\":\"location\",\"type\":\"string\",\"default\":\"Noida\"}]}");
Producer<String, GenericRecord> producer = new KafkaProducer<String, GenericRecord>(props);
GenericRecord record = new GenericData.Record(schema);
record.put("uID", "06080000");
record.put("userName", "User data10");
record.put("company", "User data10");
record.put("age", 12);
record.put("location", "User data10");
ProducerRecord<String, GenericRecord> recordData = new ProducerRecord<String, GenericRecord>(topic, "ip", record);
producer.send(recordData);
System.out.println("Message Sent");
}
公共类AvroProducer{
公共静态void main(字符串[]args)引发ExecutionException、InterruptedException{
Properties props=新属性();
put(“bootstrap.servers”,“localhost:9092”);
道具放置(“ZOOKEEPER_主机”、“localhost”);
//道具放置(“阿克斯”、“全部”);
道具放置(“重试”,0);
put(“key.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
put(“value.serializer”、“io.confluent.kafka.serializers.KafkaAvroSerializer”);
put(“schema.registry.url”http://localhost:8081");
String topic=“合流新”;
Schema.Parser=新Schema.Parser();
//我将从模式注册表中获取以下模式字符串
该方案是一个“现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除以外以外以外以外以外以外以外以外以外的以外以外以外的以外,主主主主主主主主主方案方案方案方案方案方案图示图示图示除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外,类型外外外,除除除除除除除除除除除除除除除除除除除除除除除“default\”:\“Noida\”}]});
制作人=新卡夫卡制作人(道具);
GenericRecord=新的GenericData.record(模式);
记录。输入(“uID”,“06080000”);
记录。输入(“用户名”、“用户数据10”);
记录。投入(“公司”、“用户数据10”);
记录。投入(“年龄”,12岁);
记录。放置(“位置”、“用户数据10”);
ProducerRecordData=新的ProducerRecord(主题“ip”,记录);
生产者。发送(记录数据);
System.out.println(“已发送消息”);
}
}
生产者代码似乎正常,并且能够在控制台上看到发送的消息
卡夫卡消费者代码为:
public class AvroConsumer {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("ZOOKEEPER_HOST", "localhost");
props.put("acks", "all");
props.put("retries", 0);
props.put("group.id", "consumer1");
props.put("auto.offset.reset", "latest");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer");
props.put("schema.registry.url", "http://localhost:8081");
String topic = "confluent-new";
KafkaConsumer<String, GenericRecord> consumer = new KafkaConsumer<String, GenericRecord>(props);
consumer.subscribe(Arrays.asList(topic));
while(true){
ConsumerRecords<String, GenericRecord> recs = consumer.poll(10000);
for (ConsumerRecord<String, GenericRecord> rec : recs) {
System.out.printf("{AvroUtilsConsumerUser}: Recieved [key= %s, value= %s]\n", rec.key(), rec.value());
}
}
}
公共类AvroConsumer{
公共静态void main(字符串[]args)引发ExecutionException、InterruptedException{
Properties props=新属性();
put(“bootstrap.servers”,“localhost:9092”);
道具放置(“ZOOKEEPER_主机”、“localhost”);
道具放置(“阿克斯”、“全部”);
道具放置(“重试”,0);
道具放置(“group.id”、“consumer1”);
道具放置(“自动偏移重置”、“最新”);
put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
put(“value.deserializer”、“io.confluent.kafka.serializer.KafkaAvroDeserializer”);
put(“schema.registry.url”http://localhost:8081");
String topic=“合流新”;
卡夫卡消费者=新卡夫卡消费者(道具);
consumer.subscribe(Arrays.asList(topic));
while(true){
ConsumerRecords recs=消费者投票(10000);
用于(消费者记录记录:记录){
System.out.printf(“{AvroUtilsConsumerUser}:接收到[key=%s,value=%s]\n”,rec.key(),rec.value());
}
}
}
}
我无法看到卡夫卡消费端上的消息(数据)。此外,我还检查了confluent_new主题及其未更新的偏移量计数/状态。似乎生产者代码有一些问题。
任何指针都会有帮助
同时,下面的生产者代码正在工作,这里的POJO即用户是avro工具生成的POJO
public class AvroProducer {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Properties props = new Properties();
kafkaParams.put("auto.offset.reset", "smallest");
kafkaParams.put("ZOOKEEPER_HOST", "bihdp01");*/
props.put("bootstrap.servers", "localhost:9092");
props.put("ZOOKEEPER_HOST", "localhost");
props.put("acks", "all");
props.put("retries", 0);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
props.put("schema.registry.url", "http://localhost:8081");
String topic = "confluent-new";
Producer<String, User> producer = new KafkaProducer<String, User>(props);
User user = new User();
user.setUID("0908");
user.setUserName("User data10");
user.setCompany("HCL");
user.setAge(20);
user.setLocation("Noida");
ProducerRecord<String, User> record = new ProducerRecord<String, User>(topic, (String) user.getUID(), user);
producer.send(record).get();
System.out.println("Sent");
}
公共类AvroProducer{
公共静态void main(字符串[]args)引发ExecutionException、InterruptedException{
Properties props=新属性();
卡夫卡帕拉姆斯.普特(“自动偏移.复位”,“最小”);
kafkaParams.put(“ZOOKEEPER_HOST”、“bihdp01”)*/
put(“bootstrap.servers”,“localhost:9092”);
道具放置(“ZOOKEEPER_主机”、“localhost”);
道具放置(“阿克斯”、“全部”);
道具放置(“重试”,0);
put(“key.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
put(“value.serializer”、“io.confluent.kafka.serializers.KafkaAvroSerializer”);
put(“schema.registry.url”http://localhost:8081");
String topic=“合流新”;
制作人=新卡夫卡制作人(道具);
用户=新用户();
user.setUID(“0908”);
user.setUserName(“用户数据10”);
用户:setCompany(“HCL”);
用户设置(20);
用户设置位置(“Noida”);
ProducerRecord记录=新的ProducerRecord(主题,(字符串)user.getUID(),user);
producer.send(record.get();
系统输出打印项次(“发送”);
}
}
p.S.我的要求是将收到的JSON数据以AVRO格式从源卡夫卡主题发送到目标卡夫卡主题。首先,我使用AVRO4S从接收到的JSON数据推断AVRO模式,并将该模式注册到模式注册表。下一步是从接收到的JSON中提取数据并填充GenericRecord实例,然后使用KafkaAvroSerializer将此GenericRecord实例发送给Kafka topic。在消费者端,我将使用Kafkaavroderializer对收到的AVRO数据进行反序列化。请尝试在第一个生产者中添加get()
producer.send(recordData).get();
请尝试在第一个生产者中添加get()
producer.send(recordData).get();
在寻找解决方案的过程中,我尝试了Thread.sleep(1000),它解决了我的问题。我还尝试了producer.send(record).get(),这也解决了这个问题。看完之后,我看到了下面的代码片段,它提示了解决方案
// When you're finished producing records, you can
flush the producer to ensure it has all been `written` to Kafka and
// then close the producer to free its resources.
finally {
producer.flush();
producer.close();
}
这是解决此问题的最佳方法。在寻找解决方案的过程中,我尝试了Thread.sleep(1000),它解决了我的问题。我还尝试了producer.send(record).get(),这也解决了这个问题。看完之后,我看到了下面的代码片段,它提示了解决方案
// When you're finished producing records, you can
flush the producer to ensure it has all been `written` to Kafka and
// then close the producer to free its resources.
finally {
producer.flush();
producer.close();
}
这是解决此问题的最佳方法。
kafkaParams.put(“auto.offset.reset”,“minimable”)代码>应改为“最早”。生产者将在本地缓冲一小段时间。在应用程序终止到m之前,您应该producer.close()