Apache kafka 使用avro模式将kafka消费者消息从字符串解码为avro

Apache kafka 使用avro模式将kafka消费者消息从字符串解码为avro,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我们将数据作为字符串发送给Kafka producer,消费者的最终输出是Avro模式格式 我需要使用avro模式对最终输出进行解码。是否有人可以共享示例java代码来执行此操作。遵循以下步骤- 1.从avro模式创建对象 java -jar /path/to/avro-tools-1.8.2.jar compile schema <schema file> <destination> eg. java -jar /path/to/avro-tools-1.8.2.

我们将数据作为字符串发送给Kafka producer,消费者的最终输出是Avro模式格式

我需要使用avro模式对最终输出进行解码。是否有人可以共享示例java代码来执行此操作。

遵循以下步骤-

1.从avro模式创建对象

java -jar /path/to/avro-tools-1.8.2.jar compile schema <schema file> <destination>

eg.
java -jar /path/to/avro-tools-1.8.2.jar compile schema user.avsc .
 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://kafka-.XXX");

 KafkaConsumer<String, avro_schema> consumer = new KafkaConsumer<>(props);

 consumer.subscribe(Arrays.asList("topic"));
 //infinite poll loop

 try {
      while (true) {

           ConsumerRecords<String, avro_schema> records = consumer.poll(200L);
           for (ConsumerRecord<String, avro_schema> record : records) {
                   System.out.println(record.value());

           }
      }
 }

java-jar/path/to/avro-tools-1.8.2.jar编译模式
如。
java-jar/path/to/avro-tools-1.8.2.jar编译模式user.avsc。

这将根据模式的命名空间在包中生成适当的源文件

  • 使用avro模式和上面生成的类进行反序列化

    java -jar /path/to/avro-tools-1.8.2.jar compile schema <schema file> <destination>
    
    eg.
    java -jar /path/to/avro-tools-1.8.2.jar compile schema user.avsc .
    
     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://kafka-.XXX");
    
     KafkaConsumer<String, avro_schema> consumer = new KafkaConsumer<>(props);
    
     consumer.subscribe(Arrays.asList("topic"));
     //infinite poll loop
    
     try {
          while (true) {
    
               ConsumerRecords<String, avro_schema> records = consumer.poll(200L);
               for (ConsumerRecord<String, avro_schema> record : records) {
                       System.out.println(record.value());
    
               }
          }
     }
    
    例如,如果上面的命令将源类创建为User.class,则按如下所示反序列化数据
  • private static void反序列化(){
    试一试{
    //从磁盘反序列化用户
    DatumReader userDatumReader=新的SpecificDatumReader(User.class);
    DataFileReader DataFileReader=新的DataFileReader(新文件(“users.avro”)、userDatumReader;
    User=null;
    while(dataFileReader.hasNext()){
    //通过将用户对象传递给next()来重用该对象。这样可以避免
    //为具有的文件分配和垃圾收集许多对象
    //很多项目。
    user=dataFileReader.next(用户);
    System.out.println(“反序列化:+用户);
    }
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    }
    

    以下是我的解决方法:此代码将以Avro模式格式打印消费者消息

    props.put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
    put(“value.deserializer”、“io.confluent.kafka.serializer.KafkaAvroDeserializer”);
    put(“schema.registry.url”http://kafka-.XXX");
    卡夫卡消费者=新卡夫卡消费者(道具);
    consumer.subscribe(Arrays.asList(“topic”);
    //无限轮询循环
    试一试{
    while(true){
    ConsumerRecords记录=consumer.poll(200L);
    对于(消费者记录:记录){
    System.out.println(record.value());
    }
    }
    }
    
    例如,谢谢。我必须读取消费者流数据并解码每个偏移量。我们可以从文件中读取模式吗?Schema Schema=newschema.Parser().parse(新文件(“src/avrto_Schema.avsc”);