Apache kafka 使用avro模式将kafka消费者消息从字符串解码为avro
我们将数据作为字符串发送给Kafka producer,消费者的最终输出是Avro模式格式 我需要使用avro模式对最终输出进行解码。是否有人可以共享示例java代码来执行此操作。遵循以下步骤- 1.从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.
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”);