Я пытался подключиться с kafka-avro-console-consumer из Confluent к нашему унаследованному кластеру Kafka, который был развернут без реестра Confluent Schema Registry. Я предоставил схему, явно используя такие свойства, как:

kafka-console-consumer --bootstrap-server kafka02.internal:9092 \
    --topic test \
    --from-beginning \
    --property key.schema='{"type":"long"}' \
    --property value.schema='{"type":"long"}'

Но я получаю "Неизвестный магический байт!" ошибка с org.apache.kafka.common.errors.SerializationException

Можно ли использовать сообщения Avro из Kafka с помощью Confluent kafka-avro-console-consumer, которые не были сериализованы с помощью AvroSerializer из Confluent и с помощью реестра схем?

6
Martin Macak 19 Сен 2018 в 09:24

2 ответа

Лучший ответ

Сериализатор / десериализатор реестра Confluent Schema Registry использует провод формат, который включает информацию об идентификаторе схемы и т. д. в начальных байтах сообщения.

Если ваше сообщение не было сериализовано с помощью сериализатора реестра схем, вы не сможете десериализовать его с его помощью и получите ошибку Unknown magic byte!.

Поэтому вам нужно написать потребителя, который извлекает сообщения, выполняет десериализацию с использованием ваших схем Avro avsc, а затем, предполагая, что вы хотите сохранить данные, повторно сериализовать их, используя сериализатор реестра схемы

Изменить: Недавно я написал статью, в которой все это объясняется более подробно: https://www.confluent.io/blog/kafka-connect-deep-dive-converters-serialization-explained

5
Robin Moffatt 29 Ноя 2018 в 10:09

kafka-console-consumer ничего не знает о key.schema или value.schema, только производитель Avro. Исходный код здесь

Обычному пользователю консоли не важен формат данных - он просто печатает байты в кодировке UTF8.

Свойство, которое принимает kafka-avro-console-consumer, равно только schema.registry.url. Итак, чтобы ответить на вопрос, да, его нужно сериализовать с помощью сериализаторов Confluent.

2
OneCricketeer 19 Сен 2018 в 18:33