【发布时间】:2019-03-03 08:56:39
【问题描述】:
我正在尝试使用 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 连接器时,它不再工作了。相反,它输出 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 格式作为输入。
在我看来,sink 连接器中 avro 格式的反序列化没有正确实现,因为 console-avro-consumer 仍然可以成功读取数据。 有谁知道这种行为的原因是什么?我也很感激一个简单的解决方法!
【问题讨论】:
标签: apache-kafka hdfs avro confluent-platform confluent-schema-registry