Десериализатор Kafka Avro без использования POJO - PullRequest
0 голосов
/ 16 мая 2019

Я написал Kafka Avro Deserializer, используя файл схемы Avro с сгенерированным исходным кодом Java. Требование не использовать POJO. Как я могу сделать приведенный ниже код, чтобы не использовать POJO и преобразование общей схемы.

    import java.util.Arrays;
    import java.util.Map;
    import org.apache.avro.generic.GenericDatumReader;
    import org.apache.avro.generic.GenericRecord;
    import org.apache.avro.io.DatumReader;
    import org.apache.avro.io.Decoder;
    import org.apache.avro.io.DecoderFactory;
    import org.apache.kafka.common.errors.SerializationException;
    import org.apache.kafka.common.serialization.Deserializer;
    import com.example.org.model.Person;

    public class AvroDeserializer implements Deserializer<GenericRecord> {

     @Override
     public void close() {

     }

     @Override
     public void configure(Map<String, ?> configs, boolean isKey) {

    }

    @Override
    public GenericRecord deserialize(String topic, byte[] data) {
    try {
      GenericRecord result = null;

      if (data != null) {
        DatumReader<Person> reader = new SpecificDatumReader<> 
     (Person.getSchema());

        Decoder decoder = DecoderFactory.get().binaryDecoder(data, null);
        result = (GenericRecord) reader.read(null, decoder);
      }
      return result;
     } catch (Exception ex) {
      throw new SerializationException(
      "Can't deserialize data '" + Arrays.toString(data) + "' from topic '" + topic + "'", ex);
    }
  }
    }

Как сделать так, чтобы этот код не использовал POJO.

1 Ответ

0 голосов
/ 16 мая 2019

Если вы используете класс POJO в Serilizer, тогда вы сохраняете схему вместе с данными, что создаст медлительность при разборе сообщения и также займет дополнительное место на уровне хранилища.Вы должны внести изменения в Serilizer, а также DeSerilizer.

. Чтобы исправить эту проблему, используется Реестр схем .Schema Registry

Основная идея реестра схемы заключается в том, что производитель / потребитель будет ссылаться на схему avro при чтении и записи данных в тему.

Мыне хочу писать схему для всех данных, которые вы подразумеваете - часто схема больше ваших данных!Это было бы пустой тратой времени на его анализ при чтении и тратой ресурсов (сеть, диск, процессор)

Я предлагаю вам перейти по следующей ссылке для получения кода, а также подробного описания этого.тема.

https://blog.cloudera.com/blog/2018/07/robust-message-serialization-in-apache-kafka-using-apache-avro-part-1/

...