大数据之路(八)——kafka

Apache Kafka是一个分布式流媒体平台,提供发布和订阅记录流、持久化存储及实时处理。它广泛用于构建实时数据管道和流应用程序。Kafka的核心组件包括producer、consumer、streams API和connector API。Kafka集群中的主题分为多个分区,每个分区是有序、不可变的记录序列。消费者可以控制其在日志中的偏移,实现灵活的数据消费。此外,Kafka支持高吞吐量、低延迟的数据存储和处理,并具有强大的容错性和可扩展性。
摘要由CSDN通过智能技术生成

kafka简介

ApacheKafka®是一个分布式流媒体平台。
流媒体平台有三个关键功能:
1、发布和订阅记录流,类似于消息队列或企业消息传递系统。
2、以容错的持久方式存储记录流。
3、记录发生时处理流。
Kafka通常用于两大类应用:
1、构建可在系统或应用程序之间可靠获取数据的实时流数据管道
2、构建转换或响应数据流的实时流应用程序
首先是几个概念:
Kafka作为一个集群运行在一个或多个可跨多个数据中心的服务器上。
Kafka集群以称为主题的类别存储记录流。
每条记录由一个键,一个值和一个时间戳组成。
Kafka有四个核心API:
1、producer API允许应用程序发布的记录流至一个或多个卡夫卡的话题。
2、consumer API允许应用程序订阅一个或多个主题,并处理所产生的对他们记录的数据流。
3、streams API允许应用程序充当流处理器,从一个或多个主题消耗的输入流,并产生一个输出流至一个或多个输出的主题,有效地变换所述输入流,以输出流。
4、 connector API允许构建和运行卡夫卡主题连接到现有的应用程序或数据系统中重用生产者或消费者。例如,关系数据库的连接器可能捕获对表的每个更改。
在Kafka中,客户端和服务器之间的通信是通过简单,高性能,语言无关的TCP协议完成的。
在这里插入图片描述

Topics and Logs
首先深入探讨Kafka为记录流提供的核心抽象 - topic.。
topic是发布记录的类别或订阅源名称。Kafka的主题总是多用户; 也就是说,一个主题可以有零个,一个或多个消费者订阅写入它的数据。
对于每个主题,Kafka群集都维护一个分区日志,如下所示:
在这里插入图片描述

每个分区都是一个有序的,不可变的记录序列,不断附加到结构化的提交日志中。分区中的记录每个都被分配一个称为偏移的顺序ID号,它唯一地标识分区中的每个记录。
Kafka集群持久地保留所有已发布的记录 - 无论它们是否已被消耗 - 使用可配置的保留期。例如,如果保留策略设置为两天,则在发布记录后的两天内,它可供使用,之后将被丢弃以释放空间。Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据不是问题。
在这里插入图片描述

每个消费者保留的唯一元数据是该消费者在日志中的偏移或位置。这种偏移由消费者控制:通常消费者在读取记录时会线性地提高其偏移量,但事实上,由于消费者控制位置,它可以按照自己喜欢的任何顺序消费记录。例如,消费者可以重置为较旧的偏移量以重新处理过去的数据,或者跳到最近的记录并从“现在”开始消费。
日志中的分区有多种用途。首先,它们允许日志扩展到超出适合单个服务器的大小。每个单独的分区必须适合托管它的服务器,但主题可能有许多分区,因此它可以处理任意数量的数据。
Topic、Partition文件存储

Topic与Partition的关系
Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。若创建topic1和topic2两个topic,且分别有13个和19个分区,则整个集群上会相应会生成共32个文件夹。partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。
Partition文件存储的特点
(1)每个partition目录相当于一个巨型文件被平均分配到多个大小相等segment数据文件中。但每个segment file消息数量不一定相等,这种特性方便old segment file快速被删除。

(2)每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。

(3)segment file组成:由2大部分组成,分别为index file(后缀“.index”)和data file(后缀“.log”),此2个文件一一对应,成对出现。

(4)segment文件命名规则:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。
在这里插入图片描述
以上述图2中一对segment file文件为例,说明segment中index和log文件对应关系物理结构如下:
在这里插入图片描述
其中以索引文件中元数据3,497为例,依次在数据文件中表示第3个message(在全局partition表示第368772个message)、以及该消息的物理偏移地址为497。
在partition中如何通过offset查找message
例如读取offset=368776的message,需要通过下面2个步骤查找。

(1)第一步查找segment file

上图为例,其中00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0.第二个文件00000000000000368769.index的消息量起始消息为368770 = 368769 + 1.同样,第三个文件00000000000000737337.index的起始消息为737338=737337 + 1,只要根据offset 进行二分查找文件列表,就可以快速定位到具体文件。当offset=368776时定位到00000000000000368769.index|log。

(2)第二步通过segment file查找message

通过第一步定位到segment file,当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址,然后再通过00000000000000368769.log顺序查找直到offset=368776为止。
Kafka集群中Partition分布规则
首先来看一条在Linux下创建topic的命令:

bin/kafka-topics.sh --create --zookeeper ip1:2181,ip2:2181,ip3:2181,ip4:2181 --replication-factor 2 --partitions 4 --topic test

此命令的意思是在四个Broker的kafka集群上创建一个名为test的Topic,并且有4个分区2个备份(此处比较容易搞混,2个Replication表示Leader和Follower一共加起来有2个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值