我正在尝试使用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仍可以成功读取数据。 有谁知道这种行为的可能原因是什么?我也很乐意为此提供一个简单的解决方案!
答案 0 :(得分:2)
与console-avro-consumer确认我可以成功读取获取的数据
我猜您是在添加--property print.key=true --from-beginning
的时候没做的。
最新值可能是Avro,但是在主题上某处的连接显然失败了,因此您需要对其进行扫描以找出发生的位置
如果使用JsonConverter
可行,并且数据实际上是磁盘上可读的JSON,那么听起来好像JDBC连接器实际上写了JSON,而不是Avro
如果您可以查明错误消息的偏移量,则可以使用设置了连接器组ID的常规控制台使用者,然后添加--max-messages
以及指定的分区和偏移量以跳过这些事件>