kafka log存储

本文介绍了如何分析Kafka topic的数据量,通过查看Kafka日志目录中特定partition的数据文件和index文件,确定在一定时间范围内接收到的数据条数。通过文件的创建和修改时间可以计算出分区接收到的数据条数,并解释了index文件的结构,用于存储数据的偏移量映射。

因为程序从kafka里某一个topic读取的数据量过大,所以想看看这topic一天共有多少数据量,到底是不是读取的api有问题。


登录到该topic某一个paritition所在的机器上,进入到kafka-logs目录下该topic-partition的子目录。子目录中存储的数据文件如下

-rw-r--r-- 1 root root     906048 12月 22 10:57 00000000000013128029.index
-rw-r--r-- 1 root root 1073741161 12月 22 10:57 00000000000013128029.log
-rw-r--r-- 1 root root    1360104 12月 25 21:00 00000000000013622079.index
-rw-r--r-- 1 root root 1073737654 12月 25 21:00 00000000000013622079.log
-rw-r--r-- 1 root root   10485760 12月 28 15:49 00000000000014923211.index
-rw-r--r-- 1 root root  993289158 12月 28 15:50 00000000000014923211.log

每一个index和log文件是一对,当log文件大到一定阀值后,就会生成一对新的index和log文件,文件名上的数字,就是这对log文件开始存储的offset。

以 00000000000013622079.log 为例,这个文件的创建时间就是其第一条数据的接收时间,修改时间就是最后一条数据接收时间

stat 00000000000014923211.log
  File: `00000000000014923211.log'
  Size: 993355992 	Blocks: 2731904    IO Block: 4096   regular file
Device: 810h/2064d	Inode: 1073756571  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-12-25 21:00:30.775876656 +0800
Modify: 2016-12-28 15:50:37.844860136 +0800
Change: 2016-12-28 15:50:37.844860136 +0800
而它下一个文件 00000000000014923211.log 名字上的offset,就是其最后一个数据的offset+1。

所以,在2016-12-25 21:00:30到2016-12-28 15:50:37这段时间内,该partition共收到数据14923211-13622079=1301132条。


那对于最后一个还没有被旋转的文件,又需要怎么看呢?

index文件是对log文件的索引,里面存储了对应log文件里的数据条数和其对应的文件偏移量的映射关系。文件是二进制的,可以用hexdump -C查看。

同样以 00000000000013622079.index 为例

00000000  00 00 00 04 00 00 11 6d  00 00 00 0b 00 00 21 90  |.......m......!.|
00000010  00 00 00 0f 00 00 44 dc  00 00 00 13 00 00 7c 5d  |......D.......|]|
...
0014c0d0  00 13 da 77 3f ff a0 db  00 13 da 7f 3f ff b1 be  |...w?.......?...|
0014c0e0  00 13 da 83 3f ff e1 31                           |....?..1|
0014c0e8 

index数据结构是:4Bytes的offset相对偏移,4Bytes的物理文件偏移。index并不是对每一个数据都记录的文件偏移,这样比较节省空间。

上述输出结果翻译可得

4,4461
11,8592
15,17628
...
1301111,1073717467
1301119,1073721790
1301123,1073733937
第一行代表该文件的第4条数据,就是该partition内offset为(13622079+4)的这条数据,可以从该log文件的4461位置开始读。
最后一行的offset为1301123,与该文件内总数据条数1301132差不多。
所以,用同样的方法查看最后一个index文件,就可以知道当前该partition的最大offset是多少了。


补充一点,
kafka api在试图读取某一个时间开始的数据时,是先通过log文件的最后修改时间定位到某一个log文件,然后再在该log文件里进一步查找。
我之前迁移过一个kafka broker,导致某一个partition内log文件的修改时间都是很新的日期,kafka api读取是就会报offsetOutOfRange的错误。
解决方法:手动修改文件的modify time...

touch -d "20161209 17:00:00" 00000000000005284459.log



### 如何配置和查看 Kafka 客户端的日志记录 #### 日志位置与配置 Kafka 的日志信息存储路径由 `server.properties` 文件中的 `log.dirs` 参数指定[^1]。对于客户端而言,默认情况下,Java 应用程序(包括 Kafka 客户端)会遵循 Java Util Logging 或 Log4j 等标准日志框架的设置。 为了调整 Kafka 客户端的日志级别或其他属性,可以在启动应用程序时通过 JVM 参数传递特定于日志系统的配置文件路径,例如 `-Djava.util.logging.config.file=/path/to/logging.properties` 对于 JUL (Java Util Logging),或者是 `-Dlog4j.configuration=file:/path/to/log4j.properties` 对于 Log4j。 #### 查看日志条目 当关注客户端行为时,如生产者从初始化连接到成功发送消息的过程以及最后关闭连接的情况,可以通过分析相应的日志条目获得洞察力[^2]。通常这类日志会被写入控制台输出或应用服务器的日志目录下,具体取决于所使用的日志库及其配置方式。 如果遇到连接或通讯方面的问题,仔细审查这些日志能够帮助定位潜在错误源并提供解决线索。 #### 使用命令行工具查询日志 针对更深入的数据层面上的操作,比如想要直接读取某个主题分区内的物理日志文件内容,则可利用 Kafka 自带的脚本工具来进行操作。例如,要解析名为 `my-topic-0` 的第一个分区内编号为 `00000000000000000000.log` 的日志段文件,可以执行如下 shell 命令: ```bash bin/kafka-dump-log.sh --files /path/to/kafka-logs/my-topic-0/00000000000000000000.log ``` 此命令将会显示该日志文件内部结构的信息,有助于理解数据是如何被持久化下来的[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值