Kafka命令行生产报错:字符'<'(编码60),期望有效值
<字符报错问题 我来帮你搞定这个头疼的报错!你遇到的character ('<' (code 60)): expected a valid value错误,其实原因很明确:kafka-avro-console-producer必须和Schema Registry配合工作,但你的环境要么没部署Schema Registry,要么生产者命令没指定它的地址,导致生产者收到了HTML格式的响应(比如404页面的<html>标签),而不是预期的JSON格式schema数据,这才触发了这个解析错误。
下面是一步步的解决办法:
1. 先确认Schema Registry已部署运行
你是用docker-compose部署的Kafka,而Confluent的Avro工具依赖Schema Registry——如果你的docker-compose.yml里没包含这个组件,那肯定会出问题。检查一下你的配置文件,应该要有类似这样的Schema Registry服务定义:
services: schema-registry: image: confluentinc/cp-schema-registry:4.0.0 hostname: schema-registry depends_on: - kafka ports: - "8081:8081" environment: SCHEMA_REGISTRY_HOST_NAME: schema-registry SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: zookeeper:2181
如果没有的话,把这段配置加进去,然后重启服务:
docker-compose up -d
2. 修正生产者命令,指定Schema Registry地址
你原来的命令里漏掉了关键的schema.registry.url参数,这个参数告诉Avro生产者去哪里找Schema Registry。另外注意你写的value.schema是不完整的,得补全字段定义。修正后的完整命令应该是这样的:
kafka-avro-console-producer \ --broker-list localhost:9092 \ --topic simple \ --property schema.registry.url=http://localhost:8081 \ --property value.schema='{"type":"record","name":"myrecord","fields":[{"name":"f1","type":"string"}]}'
执行这个命令后,你就可以输入符合schema格式的消息(比如{"f1": "test message"})来生产数据了。
3. 验证Schema Registry是否正常工作
在执行生产者命令前,你可以先curl一下Schema Registry的地址,确认它返回的是JSON响应:
curl http://localhost:8081/subjects
如果返回空数组[]或者已有的主题schema列表,说明它已经正常运行了。
额外小提示
你提到还没在Schema Registry里创建schema,这完全没问题——kafka-avro-console-producer会自动把你通过value.schema指定的结构注册到Schema Registry中,不需要手动提前创建。
内容的提问来源于stack exchange,提问作者Joe

