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_PROXY
、no_proxy
以及
HTTP_PROXY
、http_proxy
和
HTTPS_PROXY
, https_proxy
确保没有任何东西会拦截对注册表的调用。如果您正在创建 jvm 应用程序,则相应的标志是:
http.nonProxyHosts
,
http.proxyHost
和 http.proxyPort
,或
https.proxyHost
和 https.proxyPort
。
【讨论】:
以上是关于Kafka - 从命令行生成时出错(字符('<'(代码 60)):预期有效值)的主要内容,如果未能解决你的问题,请参考以下文章