实际上能看到的就是topicName+partitionID这个文件。
这个文件下有两个东西很重要。
.log结尾的文件是真正存储数据的。
.index是存放索引的。
先看看.log文件:默认会存储7天。七天过了会把这些老的数据删除掉。
再server.properties配置文件种,还有一个参数:存储1G
这个log是这个
而不是它的日志。
如果这个文件超过了1G,就会再创建一个文件。而不会再往里面放数据了。超过1G之后,新创建一个文件,怎么命名呢?
1G的文件,存储的都是消息,怎么快速从1G数据里面定位到这个数据呢?
这个时候就有index文件起作用了。
segment:片段。指的是当前这个分区里面的一个片段数据。里面只存储数据hello,atguigu等等。但是怎么定位,就需要依赖index。
kafka的分片机制:分片的规则,按照1G进行分片,往log里面只放数据。
这些东西就是偏移量,是当前log最小的偏移量,
.index文件里面存储的东西:
假如某个分区里面形成了两个log文件,
index索引对应的是log文件的索引。
我们假设log文件里面有六台就存储了1G。
所以对应的是
00000000000000.index
00000000000000.log
.log里面只存储数据,但是数据被序列化了,cat看不到。
.index里面提供的是索引,存储的是开始位置的偏移量。
因为.log文件中存储的是具体的6条消息,所以index里面提供的是当前log文件对应消息的索引。是开始位置的偏移量。
存储的是当前6条消息的起始偏移量。
这样设计的方式可以怎么定位数据呢?
首先,比较index后缀,需要找到这个消息对应的index文件。使用二分查找法定位到index文件。定位到文件之后,就需要找到具体的消息。这里存储的是消息的起始偏移量。所以,index文件里面的每一条数据的大小都是一样的,因为他们相当于元数据,存储的是相同的内容。他们存储的内容包括,对应消息的起始偏移量和消息的大小。
它们的大小一样,所以可以快速的定位到某条消息的起始偏移量
hdfsIO流的分段读取:seek()比如,现在找到了消息3这个起始偏移量而且这个消息的大小是1000B,那我们就需要定位:756-1756这段数据拿出来,就找到了第三个消息的内容。
1、通过二分查找找到索引文件
2、因为,在索引文件中,每条数据大小一样,扫描的话,就非常的快,就能很快地找到偏移量和对应消息的大小,然后再去log中去查找。
比我们直接去log里面找,快得多。
所以,虽然kafka把数据存储在磁盘中,但是读写速度还是很快的。