我在data.bin文件中有一些序列化的avro数据(可打印字符和不可打印字符的混合),我通过kafka控制台客户端将其发送到名为topicname的主题。当我通过控制台客户机(或我的java代码)从主题中读取它时,数据被破坏了。文本可以,但不可打印字符不能。
制作人:
user@server$ cat data.bin --------------- binary data, serialized AVRO (mix of printable and not printable characters)
▒▒▒▒▒▒XBADVANCED....
user@server$ hexdump data.bin
0000000 0000 0100 00ff 0000 0202 0200 a286 a882
0000010 58f7 0000 0000 0000 0002 0202 4142 5644
.......
user@server$ ./kafka-console-producer.sh --broker-list server:port --topic topicname < data.bin
JAVA HOME:
user@server$
然后我试着让控制台使用者从以下主题中阅读:
消费者:
user@server$ ./kafka-console-consumer.sh --bootstrap-server server:port --topic topicname
JAVA HOME:
������XBADVANCED..... ----------- see the not prinable data at the beginning, they are different the the original, the printable characters are ok
^CProcessed a total of 1 messages
user@server$ ./kafka-console-consumer.sh --bootstrap-server server:port --topic topicname > outputdata.bin
^CProcessed a total of 1 messages
dev@pardbd3:bin$ hexdump outputdata.bin
0000000 414a 4156 4820 4d4f 3a45 0a20 0000 0100 ----------- it starts with "JAVA HOME:" string, real begin of the data is 0000 0100 bfef 00bd 0000 0202 0200 bfef efbd bdbf ....
0000010 bfef 00bd 0000 0202 0200 bfef efbd bdbf
.....
如您所见,数据的文本部分正常,但不可打印字符被转换为另一个不可打印字符。问题是什么,有没有Kafka配置可能导致这个问题?
1条答案
按热度按时间0ve6wy6x1#
我怀疑有什么东西是腐败的。实际上,控制台使用者只打印utf-8内容,这取决于您的终端编码设置。可能你的源文件不是utf-8。但是avro不是人类可读的,如第一个cat输出所示。
console producer还需要换行分隔的值,因此如果在该二进制文件中有换行,则记录可能已损坏。
如果您计划使用avro,那么合流包
kafka-avro-console-*
使用合流模式注册表的脚本。producer脚本需要一个模式,您输入json,它将转换为与提供的模式匹配的avro。使用者将使用注册表中的模式反序列化avro,以人可读的json格式打印消息否则,如果您使用的是普通cli实用程序,那么您可能应该使用avrotools jar文件并运行
tojson
而不是原始的avro。然后您将生成和使用json。