Проблемы с десериализацией Avro в коннекторах мойки Kafka - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь прочитать данные из DB2, используя Kafka, а затем записать их в HDFS.Я использую распределенную платформу слива со стандартными разъемами JDBC и HDFS.Поскольку соединитель HDFS должен знать схему, он требует наличия авроданных в качестве входных данных.Таким образом, я должен указать следующие avro конвертеры для данных, передаваемых в Kafka (в etc / kafka / connect-distributed.properties):

key.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=io.confluent.connect.avro.AvroConverter
value.converter.schema.registry.url=http://localhost:8081

Затем я запускаю свой JDBC-коннектор и проверяю с помощью консоли:Avro-потребитель, который я могу успешно прочитать данные, полученные из DB2.

Однако, когда я запускаю HDFS Connector, он больше не работает.Вместо этого он выводит SerializationException:

Error deserializing Avro message for id -1
... Unknown magic byte!

Чтобы проверить, является ли это проблемой с разъемом HDFS, я попытался использовать простой разъем FileSink.Тем не менее, я увидел точно такое же исключение при использовании FileSink (и сам файл был создан, но остался пустым).

Затем я провел следующий эксперимент: вместо использования avro конвертера для ключа и значения я использовал конвертеры json:

key.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schema.enable=false
value.converter=org.apache.kafka.connect.json.JsonConverter
value.converter.schema.enable=false

Это устранило проблему с соединителем FileSink, т. Е.Весь конвейер от DB2 до файла работал нормально.Однако для соединителя HDFS это решение невозможно, так как соединителю требуется схема и, следовательно, формат avro в качестве входа.

Мне кажется, что десериализация формата avro в разъемах приемника не реализована должным образом, так какconsole-avro-consumer все еще может успешно читать данные.Кто-нибудь имеет представление о том, что может быть причиной такого поведения?Я также был бы признателен за идею простого решения этой проблемы!

1 Ответ

0 голосов
/ 27 сентября 2018

уточните у console-avro-consumer, что я могу успешно прочитать извлеченные данные

Я предполагаю, что вы не добавили --property print.key=true --from-beginning, когда сделали это.

Возможно, что последними значениями являются Avro, но где-то явно не удается подключиться, поэтому вам нужно отсканировать его, чтобы выяснить, где это происходит

Если работает JsonConverter, иданные фактически читаются на диске в формате JSON, а затем звучит так, как будто JDBC-коннектор фактически записал JSON, а не Avro

Если вы можете точно определить смещение для плохого сообщения, вы можете использовать обычного консольного потребителя с соединителемидентификатор группы установлен, затем добавьте --max-messages вместе с разделом и смещением, указанными для пропуска этих событий

...