2017-08-25 1 views
0

Ich habe ein veraltetes C++ - basiertes System, das binär kodierte Avro-Daten ausspuckt, die das konfluente Avro Schema-Registry-Format unterstützen. In meiner Java-Anwendung konnte ich die Nachricht mithilfe der KafkaAvroDeserializer-Klasse erfolgreich deserialisieren, konnte die Nachricht jedoch nicht ausdrucken.Kann Kafka Avro decodierte Nachricht nicht drucken

private void consumeAvroData(){ 
    String group = "group1"; 
    Properties props = new Properties(); 
    props.put("bootstrap.servers", "http://1.2.3.4:9092"); 
    props.put("group.id", group); 
    props.put("enable.auto.commit", "true"); 
    props.put("auto.commit.interval.ms", "1000"); 
    props.put("session.timeout.ms", "30000"); 
    props.put("key.deserializer", LongDeserializer.class.getName()); 
    props.put("value.deserializer", KafkaAvroDeserializer.class.getName()); 
    // props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG,"false"); 
    props.put("schema.registry.url","http://1.2.3.4:8081"); 
    KafkaConsumer<String, GenericRecord> consumer = new KafkaConsumer<String, GenericRecord>(props); 

    consumer.subscribe(Arrays.asList(TOPIC_NAME)); 
    System.out.println("Subscribed to topic " + TOPIC_NAME); 

    while (true) { 
     ConsumerRecords<String, GenericRecord> records = consumer.poll(100); 
     for (ConsumerRecord<String, GenericRecord> record : records) 
     { 
      System.out.printf("value = %s\n",record.value()); 
     } 
    } 
} 

Der Ausgang ich erhalte, ist

{"value":"�"} 

Warum ist, dass ich nicht die entserialisierten Daten drucken kann? Jede Hilfe wird geschätzt!

Antwort

2

Der Draht Format für die Confluent Avro Serializer wird hier in dem "Wire Format"

http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html

Abschnitt mit dem Titel dokumentiert Es ist ein einziges magisches Byte (derzeit immer 0), gefolgt von einer 4-Byte-Schema-ID als Von der Schema-Registry zurückgegeben, gefolgt von einer Menge von Bytes, die die Avro-Serialisierungsdaten in Avros Binärcodierung sind.

Wenn Sie die Nachricht als ByteArray lesen und die ersten 5 Bytes ausdrucken, wissen Sie, ob es sich um eine Confluent Avro Serialized-Nachricht handelt oder nicht. Sollte 0 sein, gefolgt von 0001 oder einer anderen Schema-ID, die Sie überprüfen können, ob es in der Schema-Registrierung für dieses Thema ist.

Wenn es nicht in diesem Format ist, wird die Nachricht wahrscheinlich serialisiert (ohne Confluent Schema Registry) und Sie müssen einen anderen Deserializer verwenden oder das vollständige Schema aus dem Nachrichtenwert extrahieren oder sogar das ursprüngliche Schema abrufen Datei von einer anderen Quelle um dekodieren zu können.

+0

Vielen Dank für Ihre Antwort! Ich habe versucht, das Byte-Array manuell zu analysieren (ohne Confluent Deserializer) und ich kann das magische Byte, Schema ID drucken, aber aus irgendeinem Grund kann ich die Daten nicht drucken. – KarthikJ

+0

Diese Daten sind in einem binären Format. Sie können es nicht ausdrucken. Passt die Schema-ID zu etwas, das in Ihrer Schemaregistry für dieses Thema konfiguriert ist? –

+0

Ja. Bei der alternativen Methode verwende ich die AVSC-Datei, um die eingehenden geparsten Daten zu dekodieren, und dann versuche ich, das GenericRecord auszudrucken. Ich konnte das erste Byte als das magische Byte, 2,3,4,5 Bytes als Schema-ID und den Rest (6 bis die Länge des Arrays-1) sehen, ich behandle es als Daten und benutze Avro bytearray deserializer, um die Daten – KarthikJ

Verwandte Themen