Kafka - 从命令行生成时出错(字符('<'(代码 60)):预期有效值)

Posted

技术标签:

【中文标题】Kafka - 从命令行生成时出错(字符(\'<\'(代码 60)):预期有效值)【英文标题】:Kafka - error when producing from command line (character ('<' (code 60)): expected a valid value)Kafka - 从命令行生成时出错(字符('<'(代码 60)):预期有效值) 【发布时间】:2018-10-04 03:52:23 【问题描述】:

我在笔记本电脑上使用 Docker(使用 docker-compose)旋转了一个 Kafka。

之后,创建了新的 kafka 主题:

kafka-topics --zookeeper localhost:2181  --create --topic simple    --replication-factor 1 --partitions 1

(尚未在架构注册表中创建架构)。

现在尝试生产(基于此示例 - 步骤 3 - https://docs.confluent.io/4.0.0/quickstart.html):

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

输入值:

"f1": "value1"

错误:

"f1": "value1"
org.apache.kafka.common.errors.SerializationException: Error registering Avro schema: "type":"record","name":"myrecord","fields":["name":"f1","type":"string"]
Caused by: io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: (sun.net.www.protocol.http.HttpURLConnection$HttpInputStream); line: 1, column: 2]; error code: 50005
    at io.confluent.kafka.schemaregistry.client.rest.RestService.sendHttpRequest(RestService.java:191)
    at io.confluent.kafka.schemaregistry.client.rest.RestService.httpRequest(RestService.java:218)
    at io.confluent.kafka.schemaregistry.client.rest.RestService.registerSchema(RestService.java:307)
    at io.confluent.kafka.schemaregistry.client.rest.RestService.registerSchema(RestService.java:299)
    at io.confluent.kafka.schemaregistry.client.rest.RestService.registerSchema(RestService.java:294)
    at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.registerAndGetId(CachedSchemaRegistryClient.java:61)
    at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.register(CachedSchemaRegistryClient.java:100)
    at io.confluent.kafka.serializers.AbstractKafkaAvroSerializer.serializeImpl(AbstractKafkaAvroSerializer.java:79)
    at io.confluent.kafka.formatter.AvroMessageReader.readMessage(AvroMessageReader.java:166)
    at kafka.tools.ConsoleProducer$.main(ConsoleProducer.scala:59)
    at kafka.tools.ConsoleProducer.main(ConsoleProducer.scala)

如何解决这个问题? 可能是因为 Kafka 集群使用 SSL 但错误是虚假的吗? 谢谢。

【问题讨论】:

【参考方案1】:

kafka-avro-console-producer,默认情况下,假定 Schema Registry 正在侦听端口 http://localhost:8081。但是,如果另一个进程正在侦听该端口,则可能会出现奇怪的错误。

为了克服这个问题,您可以在使用--property schema.registry.url=http://localhost:18081 运行生产者时指定架构 URL

例如,

kafka-avro-console-producer \
         --broker-list localhost:9092 --topic simple \
         --property value.schema='"type":"record","name":"myrecord","fields":["name":"f1","type":"string"]' \
         --property schema.registry.url=http://localhost:18081

【讨论】:

谢谢。我的模式注册表(用于本地 Docker)位于localhost:8080。添加了这一点,现在出现了新错误:ERROR Error when sending message to topic simple with key: null, value: 12 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback:52) org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [simple]。我猜是因为这是带有 SSL 的 Docker,所以应该启用 ACL 或者传递一个配置参数文件...... @Joe 我认为最好为您遇到的这个新错误打开一个单独的问题!【参考方案2】:

我遇到了同样的错误,但解决方案在我的情况下有所不同。我在这里发帖以防其他人觉得这很有用。

此错误与访问架构注册表和预期响应有关。因此,要么配置不正确,客户端无法评估模式注册表,要么无法识别响应。

    因此,请检查您是否提供了正确的配置,--property schema.registry.url 在这种情况下与 Giorgos 提到的一样。另见:https://docs.confluent.io/5.5.1/schema-registry/serdes-develop/serdes-avro.html

    您也可以curl架构注册表查看是否收到任何响应,例如

    curl -X GET http://localhost:8081/subjects
    

    另见:https://docs.confluent.io/5.5.1/schema-registry/develop/using.html


    就我而言,问题在于过滤流量的网络代理。所以检查:

    NO_PROXYno_proxy 以及 HTTP_PROXYhttp_proxyHTTPS_PROXY, https_proxy

    确保没有任何东西会拦截对注册表的调用。如果您正在创建 jvm 应用程序,则相应的标志是:

    http.nonProxyHosts, http.proxyHosthttp.proxyPort,或 https.proxyHosthttps.proxyPort

【讨论】:

以上是关于Kafka - 从命令行生成时出错(字符('<'(代码 60)):预期有效值)的主要内容,如果未能解决你的问题,请参考以下文章

仅在从命令行构建 Qt 项目时出错

生成嵌入式 kafka 时出错

为啥从 powershell 命令行连接到 github 时出错?

标记字符串,识别字符时出错

从 DOS 命令行运行 JUnit 测试时出错

从 PIPE 写入和读取结构时出错