如何基于数组形式的Avro Schema手动生产Kafka消息?
手动生产符合Avro Schema的Kafka消息方案
问题排查
你手动发送的JSON存在两个核心问题:
- 语法错误:
"ddd": "ddd",末尾多了一个逗号,这会直接导致JSON解析失败 - 根Schema未明确:你的Schema是包含多个记录的数组,Java代码发送时默认绑定了
MainAvro作为根类型,但手动发送时需要显式指定该根类型,否则工具无法识别要使用的结构
修正后的合法JSON消息
先修正语法错误,得到符合结构要求的JSON:
{ "aaa": { "ccc": "ccc", "xxx": "xxx" }, "bbb": { "ddd": "ddd" } }
手动发送的具体操作
如果使用kafka-avro-console-producer工具发送,分两种场景处理:
场景1:直接传入完整Schema发送
kafka-avro-console-producer \ --broker-list <kafka-broker地址> \ --topic <目标topic名称> \ --schema '[{"type":"record","name":"BbbAvro","fields":[{"name":"ddd","type":"string"}]},{"type":"record","name":"AaaAvro","fields":[{"name":"ccc","type":"string"},{"name":"xxx","type":"string"}]},{"type":"record","name":"MainAvro","fields":[{"name":"bbb","type":"BbbAvro"},{"name":"aaa","type":"AaaAvro"}]}]'
场景2:关联Schema Registry发送
如果你的集群已配置Schema Registry,且该Schema已通过Java代码自动注册,可简化命令:
kafka-avro-console-producer \ --broker-list <kafka-broker地址> \ --topic <目标topic名称> \ --property schema.registry.url=<schema-registry地址> \ --property value.schema.name=MainAvro
额外注意事项
- 字段名、类型严格匹配Schema定义,大小写敏感
- 若Schema中字段允许为null,未赋值的可选字段需显式设为
null - JSON格式支持压缩或格式化,但必须保证语法完全合法
内容的提问来源于stack exchange,提问作者Hayami Pysh
相关产品推荐
相关产品推荐

