面试题来源:
《大数据面试题 V4.0》
大数据面试题V3.0,523道题,679页,46w字
参考答案:
一个 Kafka 的 Message 由一个固定长度的 header 和一个变长的消息体 body 组成,header 部分由一个字节的 magic(文件格式)和四个字节的 crc32(用于判断 body 消息体是否正常)构成。当 magic 的值为 1 的时候,会在 magic 和 crc32 之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果 magic 的值为 0,那么不存在 attributes 属性。
body 是由 N 个字节构成的一个消息体,包含了具体的 key/value 消息。
具体字段解释如下:
-
CRC32:4个字节,消息的校验码。
-
magic:1字节,魔数标识,与消息格式有关,取值为0或1。当magic为0时,消息的offset使用绝对offset且消息格式中没有timestamp部分;当magic为1时,消息的offset使用相对offset且消息格式中存在timestamp部分。所以,magic值不同,消息的长度是不同的。
-
attributes: 1字节,消息的属性。其中第0~ 2位的组合表示消息使用的压缩类型,0表示无压缩,1表示gzip压缩,2表示snappy压缩,3表示lz4压缩。第3位表示时间戳类型,0表示创建时间,1表示追加时间。
-
timestamp: 时间戳,其含义由attributes的第3位确定。
-
key length:消息key的长度。
-
key:消息的key。
-
value length:消息的value长度。
-
value:消息的内容