专栏首页大数据成神之路Kafka工作流程及文件存储机制

Kafka工作流程及文件存储机制

文章目录

  • 一,Kafka工作流程
  • 二,文件存储机制
    • 2.1 存储机制
    • 2.2 index和log文件详解
    • 2.3 message的结构
    • 2.4 如何通过offset查找Message?
  • 三,数据目录结构

一,Kafka工作流程

Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。

topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,且每条数据都有自己的offset。

  • offset是一个long型的数字,我们通过这个offset可以确定一条在该partition下的唯一消息。在partition下面是保证了有序性,但是在topic下面没有保证有序性。

消费者组中的每个消费者,都会实时记录自己消费到了哪个offset ,以便出错恢复时,从上次的位置继续消费。

二,文件存储机制

2.1 存储机制

由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment(逻辑概念,等于index+log文件)。

每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等的segment(片段)数据文件中(每个segment文件中消息数量不一定相等),这种特性也方便old segment的删除,即方便已被消费的消息的清理,提高磁盘的利用率。每个partition只需要支持顺序读写就行,segment的文件生命周期由服务端配置参数(log.segment.bytes,log.roll.{ms,hours}等若干参数)决定。

每个segment对应两个文件——“.index”文件和“.log”文件。分别表示为segment索引文件和数据文件(引入索引文件的目的就是便于利用二分查找快速定位message位置)。这两个文件的命令规则为:partition全局的第一个segment从0开始,后续每个segment文件名以当前segment的第一条消息的offset命名,数值大小为64位,20位数字字符长度,没有数字用0填充。

这些文件位于一个文件夹下(partition目录),该文件夹的命名规则为:topic名称+分区序号。例如,first这个topic有三个分区,则其对应的文件夹为first-0,first-1,first-2。

00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log
[root@cm1 data]# pwd
/var/local/kafka/data
[root@cm1 data]# tree
.
├── cleaner-offset-checkpoint
├── meta.properties
├── recovery-point-offset-checkpoint
├── replication-offset-checkpoint
# partition目录(topic名称+分区序号)
├── test-0
# segment索引文件
│   ├── 00000000000000000000.index
# 数据文件
│   ├── 00000000000000000000.log
# 0.8版本之前的kafka没有timeindex文件,这是kafka的具体时间日志
│   └── 00000000000000000000.timeindex
│   ├── 00000000000000170410.index
│   ├── 00000000000000170410.log
│   └── 00000000000000170410.timeindex
├── test-1
│   ├── 00000000000000000000.index
│   ├── 00000000000000000000.log
│   └── 00000000000000000000.timeindex
└── test-2
    ├── 00000000000000000000.index
    ├── 00000000000000000000.log
    └── 00000000000000000000.timeindex

index和log文件以当前segment的第一条消息的offset命名。下图为index文件和log文件的结构示意图。

2.2 index和log文件详解

.index索引文件存储大量的索引信息,.log数据文件存储大量消息数据(Message),索引文件中的元数据指向对应数据文件中Message的物理偏移地址。以index索引文件中的元数据3,497为例,依次在数据文件中表示第三个Message(在全局Partition中表示第368772个message),以及该消息的物理偏移地址为497.

索引和日志文件内部的关系,如图:

2.3 message的结构

Segment的Log文件由多个Message组成,下面详细说明Message的物理结构,如图:

参数说明:

2.4 如何通过offset查找Message?

  • 先二分查找获取对应index索引文件,获取到对应的物理offset
  • 拿着物理offset去log数据文件顺序查找对应消息
  • 返回查找到的消息
  • 例如,读取offset=368776的Message,需要通过如下两个步骤。
  • 第一步:查找Segment File.

00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0;第二个文件00000000000000368770.index的起始偏移量为368770,依次类推。以起始偏移量命名并排序这些文件,只要根据offset二分查找文件列表,就可以快速定位到具体文件。

当offset=368776时,定位到00000000000000368770.index|log。

  • 第二步:通过Segment File 查找Message。

通过第一步定位到Segment File,当offset=368776时,依次定位到00000000000000368770.index的元数据物理位置和00000000000000368770.log的物理偏移地址,然后再通过00000000000000368770.log顺序查找,直到offset=368776为止。

Segment Index File采取稀疏索引存储方式,可以减少索引文件大小,通过Linux mmap接口可以直接进行内存操作。稀疏索引为数据文件的每个对应Message设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

三,数据目录结构

举例说明,向主题topic-log中发送一定量的消息,某一时刻topic-log-0目录中的布局如下所示。

示例中第2个LogSegment对应的基准位移是133,也说明了该LogSegment中的第一条消息的偏移量为133,同时可以反映出第一个LogSegment中共有133条消息(偏移量从0至132的消息)。

注意每个LogSegment中不只包含“.log”“.index”“.timeindex”这3种文件,还可能包含 “.deleted”“.cleaned”“.swap”等临时文件,以及可能的“.snapshot”“.txnindex”“leader-epoch-checkpoint”等文件。

从更加宏观的视角上看,Kafka 中的文件不只上面提及的这些文件,比如还有一些检查点文件,当一个Kafka服务第一次启动的时候,默认的根目录下就会创建以下5个文件:

├── cleaner-offset-checkpoint
├── meta.properties
├── recovery-point-offset-checkpoint
├── replication-offset-checkpoint
├── log-start-offset-checkpoint

kafka0.8之后消费者提交的位移是保存在 Kafka 内部的主题__consumer_offsets中的,初始情况下这个主题并不存在,当第一次有消费者消费消息时会自动创建这个主题。

在某一时刻,Kafka 中的文件目录布局如图 所示。每一个根目录都会包含最基本的 4个检查点文件(xxx-checkpoint)和 meta.properties 文件。在创建主题的时候,如果当前 broker中不止配置了一个根目录,那么会挑选分区数最少的那个根目录来完成本次创建任务。

本文分享自微信公众号 - 大数据技术与架构(import_bigdata)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kafka+Spark Streaming管理offset的几种方法

    场景描述:Kafka配合Spark Streaming是大数据领域常见的黄金搭档之一,主要是用于数据实时入库或分析。为了应对可能出现的引起Streaming程序...

    大数据技术与架构
  • Flink1.10和Hive集成一些需要注意的点

    前几天,Flink官方release了Flink1.10版本,这个版本有很多改动。比如:

    大数据技术与架构
  • Flink1.12集成Hive打造自己的批流一体数仓

    小编在去年之前分享过参与的实时数据平台的建设,关于实时数仓也进行过分享。客观的说,我们当时做不到批流一体,小编当时的方案是将实时消息数据每隔15分钟文件同步到离...

    大数据技术与架构
  • Kafka+Spark Streaming管理offset的几种方法

    场景描述:Kafka配合Spark Streaming是大数据领域常见的黄金搭档之一,主要是用于数据实时入库或分析。为了应对可能出现的引起Streaming程序...

    大数据真好玩
  • Kafka+Spark Streaming管理offset的几种方法

    场景描述:Kafka配合Spark Streaming是大数据领域常见的黄金搭档之一,主要是用于数据实时入库或分析。为了应对可能出现的引起Streaming程序...

    大数据技术与架构
  • sparkstreaming遇到的问题

    这篇文章介绍sparkstreaming对接kafka时遇到的两个offset的问题,首选我们介绍下offset的存储。

    soundhearer
  • Spark Streamming+Kafka提交offset实现有且仅有一次

    董可伦
  • Kafka到底有几个Offset?——Kafka核心之偏移量机制

    Kafka是由LinkIn开源的实时数据处理框架,目前已经更新到2.3版本。不同于一般的消息中间件,Kafka通过数据持久化和磁盘读写获得了极高的吞吐量...

    用户6070864
  • python 实现图像快速替换某种颜色

    最近的对图像数据进行处理的时候需要将图像中的某个颜色替换为另一个颜色,但是网络上找到的方法都是通过对图像的遍历进行替换,实在是太费时了!刚开始使用时觉得CPU很...

    砸漏
  • Springboot2整合RocketMQ消费端

    用户5640963

扫码关注云+社区

领取腾讯云代金券