【问题标题】:Does Kafka change binary data?Kafka 会更改二进制数据吗?
【发布时间】:2018-06-04 08:21:09
【问题描述】:

我在文件 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配置可能导致这个问题?

【问题讨论】:

  • 我认为这不是一个好的测试,因为在内部它使用带有消息格式化程序的https://github.com/kafka-dev/kafka/blob/master/core/src/main/scala/kafka/consumer/ConsoleConsumer.scala,因此您可能会遇到字符编码问题。我会选择字节数组序列化器/解串器
  • @Paizo 错误的 repo - 它在 Apache Github org 中

标签: apache-kafka binaryfiles avro


【解决方案1】:

我怀疑任何东西都损坏了。实际上,控制台使用者仅打印 utf-8 内容,具体取决于您的终端编码设置。可能是您的源文件不是 UTF-8。但是 Avro 不是人类可读的,如第一个 cat 输出所示。

控制台生产者还需要换行符分隔的值,因此如果在该二进制文件中提取了换行符,则记录可能已损坏。

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

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

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多