Добавление новых полей в Avro Schema получило исключение совместимости - PullRequest
0 голосов
/ 17 октября 2018

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

{
    "name": "channelType",
    "type": [
        "null",
        {
            "type": "string",
            "avro.java.string": "String"
        }
    ],
    "default": null
},

Использовал следующий код для десериализации данных.

public class RLoggerKafkaMessageDeSerializer implements Deserializer<RLoggerMessage> {
    private final DecoderFactory decoderFactory = DecoderFactory.get();
    private final DatumReader<RLoggerMessage> reader;

    public RLoggerKafkaMessageDeSerializer() {
        super();
        reader = new SpecificDatumReader<RLoggerMessage>(RLoggerMessage.getClassSchema());
    }

    @Override
    public RLoggerMessage deserialize(final String topic, final byte[] data) {
        try {
            BinaryDecoder decoder = decoderFactory.binaryDecoder(data, null);
            RLoggerMessage rlogMessage = reader.read(null, decoder);

            return rlogMessage;
        } catch (Exception e) {
            throw new SerializationException("Error deserialize message", e);
        } 
    }
}

Затем я получил следующие ошибки:

java.io.EOFException
at org.apache.avro.io.BinaryDecoder.ensureBounds(BinaryDecoder.java:473)
at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:128)
at org.apache.avro.io.BinaryDecoder.readIndex(BinaryDecoder.java:423)
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:178)
at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:116)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:230)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:174)
at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:116)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:230)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:174)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:144)

Примечания: я нашел одно решение, которое заключается в добавлении как старой схемы, так и новой схемы в SpecificDatumReader.Перейдите по этой ссылке: Схема Avro не поддерживает обратную совместимость .Это решение не работает для меня.Наша команда использует схему Registry.Я уже загрузил новую схему в реестр реестра.Я понимаю, что должна быть выбрана самая последняя схема для сериализации / десериализации данных.Однако вышеприведенное исключение появилось.

...