Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在卡夫卡中,消息的大小开销是多少?_Java_Apache Kafka - Fatal编程技术网

Java 在卡夫卡中,消息的大小开销是多少?

Java 在卡夫卡中,消息的大小开销是多少?,java,apache-kafka,Java,Apache Kafka,假设原始消息大小为500字节(在发送到Kafka之前)。那么,在发送给卡夫卡之后,信息的大小是多少?如果我们使用任何压缩呢 附加信息:我将一个大小为2048字节的ByteBuffer放入一个主题(带有单个分区),而不带任何键 Topic name: ub3 Path: /data/kafka-logs/ub3-0 [hdpusr@hdpdev2 ub3-0]$ $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --bro

假设原始消息大小为500字节(在发送到Kafka之前)。那么,在发送给卡夫卡之后,信息的大小是多少?如果我们使用任何压缩呢

附加信息:我将一个大小为2048字节的ByteBuffer放入一个主题(带有单个分区),而不带任何键

Topic name: ub3
Path: /data/kafka-logs/ub3-0

[hdpusr@hdpdev2 ub3-0]$ $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list hdpdev2:8092 --topic ub3 --time -1 --offsets 1 | awk -F ":" '{sum += $3} END {print sum}'
184
[hdpusr@hdpdev2 ub3-0]$ du -sh *
10M     00000000000000000000.index
448K    00000000000000000000.log
10M     00000000000000000000.timeindex
4.0K    leader-epoch-checkpoint
[hdpusr@hdpdev2 ub3-0]$
[hdpusr@hdpdev2 ub3-0]$
[hdpusr@hdpdev2 ub3-0]$ $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list hdpdev2:8092 --topic ub3 --time -1 --offsets 1 | awk -F ":" '{sum += $3} END {print sum}'
86284
[hdpusr@hdpdev2 ub3-0]$ du -sh *
10M     00000000000000000000.index
256M    00000000000000000000.log
10M     00000000000000000000.timeindex
4.0K    leader-epoch-checkpoint
[hdpusr@hdpdev2 ub3-0]$


[hdpusr@hdpdev2 ub3-0]$ $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list hdpdev2:8092 --topic ub3 --time -1 --offsets 1 | awk -F ":" '{sum += $3} END {print sum}'
172405
[hdpusr@hdpdev2 ub3-0]$ du -sh *
10M     00000000000000000000.index
512M    00000000000000000000.log
10M     00000000000000000000.timeindex
4.0K    leader-epoch-checkpoint
[hdpusr@hdpdev2 ub3-0]$



[hdpusr@hdpdev2 ub3-0]$ $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list hdpdev2:8092 --topic ub3 --time -1 --offsets 1 | awk -F ":" '{sum += $3} END {print sum}'
258491
[hdpusr@hdpdev2 ub3-0]$ du -sh *
10M     00000000000000000000.index
596M    00000000000000000000.log
10M     00000000000000000000.timeindex
4.0K    leader-epoch-checkpoint
[hdpusr@hdpdev2 ub3-0]$



[hdpusr@hdpdev2 ub3-0]$ $KAFKA_HOME/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list hdpdev2:8092 --topic ub3 --time -1 --offsets 1 | awk -F ":" '{sum += $3} END {print sum}'
344563
[hdpusr@hdpdev2 ub3-0]$ du -sh *
10M     00000000000000000000.index
1.1G    00000000000000000000.log
10M     00000000000000000000.timeindex
4.0K    leader-epoch-checkpoint
[hdpusr@hdpdev2 ub3-0]$

简单的回答是:谁知道呢

但是让我们试着找出一些数字。我已经开始在Docker使用卡夫卡。然后,一位简单的制作人写道:

公共类应用程序{
公共静态void main(字符串[]args)引发异常{
最终生产者=生产者();
制作人发送(
新产品记录(
“测试”,
键(),
值()
)
).get();
}
私人静态制作者(制作者){
最终属性道具=新属性();
put(ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG,“localhost:9092”);
props.put(ProducerConfig.CLIENT_ID_CONFIG,“so57472830”);
put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.CLASS.getName());
put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,ByteArraySerializer.CLASS.getName());
归还新卡夫卡制作人(道具);
}
私有静态字符串密钥(){
返回UUID.randomUUID().toString();
}
}
因此,将发送到
localhost:9092
,客户端id等于
so57472830
,进入
test
主题。有效负载是字节数组,键是字符串UUID。正如您稍后将看到的,所有这些值(除了host:port)都会导致“开销”。在这里,我假设开销是除了消息负载本身之外的一切

让我们从“你好,世界!”:

私有静态字节[]值(){
返回“你好,世界!”.getBytes();
}
运行应用程序并捕获本地主机:9092的流量。我用过这个

在这里,我找到了带有有效载荷的消息。让我们看看整个TCP流(WireShark中的“跟随TCP流”):

因此,整个流占用了527个字节,其中客户端发送(用玫瑰色突出显示)195:

(这也意味着卡夫卡发送527-195==332字节作为响应):

我们的有效载荷是13字节。正如您所注意到的,出站流量包含两个客户端id(2×10字节)和消息密钥(16字节)。因此,在195个字节中,有146个是神秘的(可能就是你在问题中称为“开销”的那个)

让我们发送500个随机字节:

私有静态字节[]值(){
最终字节[]结果=新字节[500];
新的Random().nextBytes(结果);
返回结果;
}
出站流量为684字节(整个对话耗时1016):

同样,服务器发送332字节作为响应,出站神秘(开销)由684-(500+2×10+16)=164字节组成

所有这些数字都不是最终数字,可能会随着生产者版本或特定配置设置的变化而变化。您提到过,其中之一是压缩。我们来看看。请注意,压缩取决于数据。随机字节比常量字节更难压缩,因为它们有更多的熵。那么,让我们通过GZIP压缩发送500个重复字节。在没有压缩的情况下,数字是相同的:

添加
props.put(ProducerConfig.COMPRESSION\u TYPE\u CONFIG,“gzip”)
producer()
方法并更改
值()

私有静态字节[]值(){
最终字节[]结果=新字节[500];
填充(结果,(字节)'a');
返回结果;
}
启用压缩后,将压缩消息(密钥和值,而不是客户端id和主题),出站流量仅为208字节:

我想说,开销与上面示例中的大致相同,压缩会影响消息本身的大小


这一切都适用于流量,但在您编辑后,我发现您对存储大小感兴趣。不过,我想说,答案是一样的:“谁知道呢”。数字肯定取决于您的配置。

谢谢您的详细解释。将等待其他人提出他们的观点,这可能会有所帮助。