Kafka是否更改了二进制数据?

时间:2018-06-04 08:21:09

标签: apache-kafka binaryfiles avro

我在文件data.bin中有一些序列化的AVRO数据(可打印和不可打印字符的混合),我将它由Kafka控制台客户端发送到名为topicname的主题。当我从主题的控制台客户端(或我的java代码)读取它时,数​​据已损坏。文字没问题,但不是可打印的字符。

PRODUCER:

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$

然后我尝试从控制台消费者那里读取主题:

CONSUMER:

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 个答案:

答案 0 :(得分:2)

我怀疑有什么东西被腐蚀了。控制台消费者实际上只打印utf-8内容,具体取决于您的终端编码设置。你的源文件可能不是UTF-8。但是Avro不是人类可读的,正如第一次猫输出所示。

控制台生产者也期望换行符分隔值,因此如果在该二进制文件中拾取了换行符,则记录可能已损坏。

如果您打算使用Avro,Confluent打包使用Confluent Schema Registry的kafka-avro-console-*脚本。生成器脚本需要一个模式,您键入JSON,它将转换为与提供的模式匹配的Avro。消费者将通过使用注册表中的模式反序列化Avro,以人类可读的JSON打印消息

否则,如果您使用的是普通的CLI实用程序,则应该使用avro-tools JAR文件并在主题中运行tojson而不是原始Avro。然后你将生产和使用JSON。