Kafka接收器连接器中Avro反序列化的问题

时间:2018-09-27 12:29:03

标签: apache-kafka hdfs avro confluent confluent-schema-registry

我正在尝试使用Kafka从DB2读取数据,然后将其写入HDFS。我使用具有标准JDBC和HDFS连接器的分布式融合平台。 由于HDFS连接器需要了解架构,因此需要avro数据作为输入。因此,我必须为馈送到Kafka的数据指定以下avro转换器(在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连接器,并与console-avro-consumer一起检查是否可以成功读取从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 :(得分:2)

  

与console-avro-consumer确认我可以成功读取获取的数据

我猜您是在添加--property print.key=true --from-beginning的时候没做的。

最新值可能是Avro,但是在主题上某处的连接显然失败了,因此您需要对其进行扫描以找出发生的位置

如果使用JsonConverter可行,并且数据实际上是磁盘上可读的JSON,那么听起来好像JDBC连接器实际上写了JSON,而不是Avro

如果您可以查明错误消息的偏移量,则可以使用设置了连接器组ID的常规控制台使用者,然后添加--max-messages以及指定的分区和偏移量以跳过这些事件