8

kafka-avro-console-producer从 confluent-3.0.0 使用,执行以下操作时发生错误:

./bin/kafka-avro-console-producer --broker-list localhost:9092 --topic test1234 --property value.schema='{"type":"record","name":"myrecord","fields":[{"name":"f1","type":"string"}]}'
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/tonydao/dev/bin/confluent-3.0.0/share/java/kafka-serde-tools/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/tonydao/dev/bin/confluent-3.0.0/share/java/confluent-common/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/tonydao/dev/bin/confluent-3.0.0/share/java/schema-registry/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
{"f1":"value1"}
{"f1":"value2"}

org.apache.kafka.common.errors.SerializationException: Error deserializing json  to Avro of schema {"type":"record","name":"myrecord","fields":[{"name":"f1","type":"string"}]}
Caused by: java.io.EOFException
    at org.apache.avro.io.JsonDecoder.advance(JsonDecoder.java:138)
    at org.apache.avro.io.JsonDecoder.readString(JsonDecoder.java:219)
    at org.apache.avro.io.JsonDecoder.readString(JsonDecoder.java:214)
    at org.apache.avro.io.ResolvingDecoder.readString(ResolvingDecoder.java:201)
    at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:363)
    at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:355)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:157)
    at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
    at io.confluent.kafka.formatter.AvroMessageReader.jsonToAvro(AvroMessageReader.java:189)
    at io.confluent.kafka.formatter.AvroMessageReader.readMessage(AvroMessageReader.java:157)
    at kafka.tools.ConsoleProducer$.main(ConsoleProducer.scala:55)
    at kafka.tools.ConsoleProducer.main(ConsoleProducer.scala)
4

3 回答 3

3
  1. 确保您仅从 confluent kafka 包中运行所有必需的服务(zookeeper kafka server和)。schema registry
  2. 您之前可能在同一台服务器上使用过其他版本的 kafka,并且可能需要清理日志目录(/tmp/kafka是默认目录)
  3. 确保您在Enter不提供数据的情况下不会点击,因为它被视为 null 并导致异常。
  4. 尝试一个全新的主题
于 2016-10-06T14:47:26.547 回答
3

当您在生产者消息中输入 NULL 值时,会发生这种情况。看起来它无法从 json->avro 转换 NULL。只需输入 json 并按 enter,然后 ctrl+d 完成。

我注意到我的 avro 生产者没有“>”字符来指定它正在接受消息。因此,当我点击它时,我正在按 Enter 以从脚本中获得一些响应。

于 2019-05-10T18:41:50.703 回答
1

首先,当您运行此命令时,请在双引号中添加转义字符,如下所示,然后按一次回车:

./bin/kafka-avro-console-producer --broker-list localhost:9092 --topic test1234 --property value.schema='{\"type\":\"record\",\"name\":\"myrecord\",\"fields\":[{\"name\":\"f1\",\"type\":\"string\"}]}'

一旦你运行它并按下回车键一次,输入一个不带转义字符的 json 对象作为双引号,如下所示:

{"f1":"value1"}

在每个 json 对象之后,只按一次 enter,如果按两次,它将把 null 作为下一个 json 对象,因为你得到了那个错误。输入 json 对象后没有得到确认,但它已经发送到 kafka,等待一两分钟并检查 kafka 的控制中心,消息应该在给定的主题中。只需按命令 c 并从生产者控制台中出来。

于 2020-12-01T06:28:09.210 回答