0
点赞
收藏
分享

微信扫一扫

12_Kafka高级_文件存储


12_Kafka高级_文件存储_数据


实际上能看到的就是topicName+partitionID这个文件。

这个文件下有两个东西很重要。

12_Kafka高级_文件存储_偏移量_02


.log结尾的文件是真正存储数据的。

.index是存放索引的。

12_Kafka高级_文件存储_kafka_03


先看看.log文件:默认会存储7天。七天过了会把这些老的数据删除掉。

12_Kafka高级_文件存储_kafka_04

再server.properties配置文件种,还有一个参数:存储1G

12_Kafka高级_文件存储_偏移量_05


12_Kafka高级_文件存储_数据_06

这个log是这个

12_Kafka高级_文件存储_数据_07


而不是它的日志。

如果这个文件超过了1G,就会再创建一个文件。而不会再往里面放数据了。超过1G之后,新创建一个文件,怎么命名呢?

1G的文件,存储的都是消息,怎么快速从1G数据里面定位到这个数据呢?

这个时候就有index文件起作用了。

12_Kafka高级_文件存储_kafka_08


segment:片段。指的是当前这个分区里面的一个片段数据。里面只存储数据hello,atguigu等等。但是怎么定位,就需要依赖index。

12_Kafka高级_文件存储_偏移量_09


12_Kafka高级_文件存储_存储数据_10


kafka的分片机制:分片的规则,按照1G进行分片,往log里面只放数据。

12_Kafka高级_文件存储_偏移量_11


这些东西就是偏移量,是当前log最小的偏移量,

.index文件里面存储的东西:

假如某个分区里面形成了两个log文件,

12_Kafka高级_文件存储_偏移量_12


index索引对应的是log文件的索引。

我们假设log文件里面有六台就存储了1G。

所以对应的是

00000000000000.index

00000000000000.log

.log里面只存储数据,但是数据被序列化了,cat看不到。

.index里面提供的是索引,存储的是开始位置的偏移量。

因为.log文件中存储的是具体的6条消息,所以index里面提供的是当前log文件对应消息的索引。是开始位置的偏移量。

12_Kafka高级_文件存储_偏移量_13


存储的是当前6条消息的起始偏移量。

这样设计的方式可以怎么定位数据呢?

首先,比较index后缀,需要找到这个消息对应的index文件。使用二分查找法定位到index文件。定位到文件之后,就需要找到具体的消息。这里存储的是消息的起始偏移量。所以,index文件里面的每一条数据的大小都是一样的,因为他们相当于元数据,存储的是相同的内容。他们存储的内容包括,对应消息的起始偏移量和消息的大小。

12_Kafka高级_文件存储_数据_14


它们的大小一样,所以可以快速的定位到某条消息的起始偏移量

hdfsIO流的分段读取:seek()比如,现在找到了消息3这个起始偏移量而且这个消息的大小是1000B,那我们就需要定位:756-1756这段数据拿出来,就找到了第三个消息的内容。

12_Kafka高级_文件存储_kafka_15


1、通过二分查找找到索引文件

2、因为,在索引文件中,每条数据大小一样,扫描的话,就非常的快,就能很快地找到偏移量和对应消息的大小,然后再去log中去查找。

比我们直接去log里面找,快得多。

所以,虽然kafka把数据存储在磁盘中,但是读写速度还是很快的。


举报

相关推荐

0 条评论