Kafka 初学者理解指南






4.94/5 (14投票s)
本指南旨在帮助您了解Kafka,并在Windows环境中进行数据管道的设置与测试。
引言
Apache Kafka 是一个分布式流处理平台,具有三个关键能力:
- 消息系统 – 发布/订阅记录流
- 可用性与可靠性 – 以容错和持久的方式存储记录流
- 可扩展与实时 – 处理正在发生的记录流
数据系统组件
Kafka通常用于将数据流式传输到应用程序、数据湖和实时流分析系统。
应用程序将消息输入到Kafka服务器。这些消息可以是任何计划捕获的定义信息。它们以可靠的方式(由于Kafka的分布式架构)传递给另一个应用程序或服务进行处理或重新处理。
内部,Kafka使用数据结构来管理其消息。这些消息在数据结构单元级别应用了保留策略。保留策略是可配置的——基于时间或基于大小。默认情况下,发送的数据存储168小时(7天)。
Kafka架构
通常,会有多个生产者、消费者、集群协同处理消息。通过添加更多代理(brokers)可以轻松实现水平扩展。下图描绘了示例架构。
Kafka通过TCP
协议在客户端和服务器之间进行通信。更多详细信息,请参阅Kafka协议指南。
Kafka生态系统提供REST代理,允许通过HTTP和JSON轻松集成。
主要有四个关键API:生产者API、消费者API、流API、连接器API。
关键组件与相关术语
消息
/记录 – 对象的字节数组。包含键、值和时间戳。主题
– 分类后的消息流。生产者
– 将消息发布到Kafka主题的进程。消费者
– 订阅主题并处理已发布消息流的进程。代理
(Broker) – 托管主题。也称为Kafka服务器
或Kafka节点
。集群
– 由一个或多个代理组成。Zookeeper
– 维护集群的状态(代理、主题、消费者)。连接器
– 将主题连接到现有应用程序或数据系统。流处理器
– 消耗来自主题的输入流并产生输出流到输出主题。ISR
(In-Sync Replica,同步副本)– 用于支持故障转移的复制。控制器
– 集群中负责维护所有分区领导者/追随者关系的代理。
动物园管理员
Apache ZooKeeper是一个开源项目,有助于构建分布式应用程序。它是一个用于维护配置信息的集中式服务。它负责以下事项:
- 代理 状态 – 维护活动代理列表以及它们所属的集群。
- 已配置的主题 – 维护所有主题列表、每个主题的分区数、所有副本的位置、首选领导者是谁、分区的ISR列表。
- 控制器 选举 – 当节点关闭时选择新的控制器。同时确保在任何给定时间只有一个控制器。
- ACL 信息 – 维护所有主题的访问控制列表(ACL)。
Kafka内部机制
集群中的代理
通过一个通常是唯一的数字ID
来区分。连接到一个代理即可将客户端引导至整个Kafka集群。它们接收来自生产者的消息,并允许消费者按主题、分区和偏移量(offset)获取消息。
一个主题
在Kafka集群中分布为一个或多个分区的逻辑组。分区被定义为分布在多个代理上的有序消息序列。每个主题的分区数在创建时是可配置的。
生产者
写入主题。消费者
从主题读取。
Kafka使用日志
数据结构来管理其消息。日志数据结构是一组有序的段
,段是消息的集合。每个段都有文件,用于定位消息。
- 日志文件 – 存储消息。
- 索引文件 – 存储消息偏移量及其在日志文件中的起始位置。
Kafka将来自生产者的记录追加到主题日志的末尾。消费者可以从任何已提交的偏移量读取,并且可以自由选择从任何偏移量点读取。只有当分区的所有ISR写入其日志后,记录才被认为是已提交的。
在多个分区中,有一个领导者,其余是副本/追随者以提供备份。如果领导者失败,将选择一个ISR
作为新的领导者。领导者负责特定主题分区的全部读写操作。追随者被动地复制领导者。消费者只能从领导者分区读取。
分区的领导者和追随者永远不会位于同一节点上。
Kafka也支持记录的日志压缩
。通过此功能,Kafka将保留记录的最新版本并删除旧版本。这实现了一种精细化的保留机制,其中每个键的最后更新都将被保留。
偏移量管理器
(Offset manager)负责存储、获取和维护消费者偏移量。每个活动的代理都有一个偏移量管理器实例。默认情况下,消费者配置为使用周期性间隔的自动提交策略。或者,消费者可以使用提交API进行手动偏移量管理。
Kafka使用一个特殊的__consumer_offsets
主题来保存消费者偏移量。此偏移量记录了每个组中每个消费者的读取位置。这有助于消费者在需要时追溯其最后位置。通过将偏移量提交到代理,消费者不再依赖ZooKeeper。
引用较早版本的Kafka(0.9之前)仅在ZooKeeper中存储偏移量,而较新版本的Kafka默认将偏移量存储在内部Kafka主题__consumer_offsets中。
Kafka允许消费者组从主题并行读取数据。组内的所有消费者具有相同的组ID。在任何时候,一个组中的只有一个消费者可以从一个分区消费消息,以保证从分区读取消息的顺序。一个消费者可以读取多个分区。
Windows上的Kafka设置
先决条件
- Java SE运行时环境
- Kafka
- 示例应用使用:Scala 2.12 – kafka_2.12-2.5.0.tgz
- 任何解压工具,用于从*.tgz中提取文件。
- 我的Mac通过双击就可以解压。
设置文件
- 安装JRE – 默认设置即可。
- 将Kafka文件解压到C:\Installs(可选择其他位置)。所有用于Kafka数据管道设置的脚本文件将位于:C:\Installs\kafka_2.12-2.5.0\bin\windows。
- 根据Windows需求进行配置更改
- 为Kafka日志设置 – 在C:\Installs\kafka_2.12-2.5.0位置创建一个名为‘logs’的文件夹。
- 在Kafka配置文件C:\Installs\kafka_2.12-2.5.0\config\server.properties中将此logs文件夹位置设置为log.dirs=C:\Installs\kafka_2.12-2.5.0\logs。
- 为ZooKeeper数据设置 – 在C:\Installs\kafka_2.12-2.5.0位置创建一个名为‘data’的文件夹。
- 在ZooKeeper配置文件C:\Installs\kafka_2.12-2.5.0\config\zookeeper.properties中将此数据文件夹位置设置为dataDir=C:\Installs\kafka_2.12-2.5.0\data。
Execute
ZooKeeper
– 使用已与Kafka文件打包的便捷脚本获取一个快速的单节点ZooKeeper实例。- 打开命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows。
- 执行脚本。
zookeeper-server-start.bat C:\Installs\kafka_2.12-2.5.0\config\zookeeper.properties
- ZooKeeper已在localhost:2181启动。保持运行。
Kafka服务器
– 获取一个单节点Kafka实例。- 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows。
- ZooKeeper已在属性文件zookeeper.connect=localhost:2181中配置。
- 执行脚本。
kafka-server-start.bat C:\Installs\kafka_2.12-2.5.0\config\server.properties
- Kafka服务器已在localhost: 9092启动。保持运行。
现在可以创建主题并存储消息了。我们可以从任何客户端生产和消费数据。目前我们将使用命令提示符。
主题
– 创建一个名为‘testkafka
’的主题。- 鉴于我们设置的是单个节点实例,请使用复制因子为1,分区为1。
- 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows。
- 执行脚本。
kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic testkafka
- 执行脚本以查看创建的主题。
kafka-topics.bat --list --bootstrap-server localhost:9092
- 保持命令提示符打开,以备不时之需。
生产者
– 设置以向服务器发送消息。- 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows。
- 执行脚本。
kafka-console-producer.bat --bootstrap-server localhost:9092 --topic testkafka
- 它将显示一个‘
>
’作为输入消息的提示符。输入:“Kafka demo – Message from server
”。 - 保持命令提示符打开。稍后我们将回来推送更多消息。
消费者
– 设置以从服务器接收消息。- 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows。
- 执行脚本。
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic testkafka --from-beginning
- 您将在该命令提示符窗口中看到生产者发送的消息 – “Kafka demo – Message from server”。
- 返回生产者命令提示符,输入任何其他消息,您将看到它们实时出现在消费者命令提示符中。
检查/观察
– 后台的一些关键变化。- 已创建主题下的文件 – 它们用于跟踪给定主题的消息推送情况。
- 日志文件中的数据 – 所有由生产者推送的消息都存储在这里。
- Kafka中的主题 – 一旦消费者开始读取主题中的消息,
__consumer_offsets
就会自动创建为一个主题。
- 已创建主题下的文件 – 它们用于跟踪给定主题的消息推送情况。
注意:如果您想选择Zookeeper来存储主题而不是Kafka服务器,则需要以下脚本命令:
- 创建主题。
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testkafka
- 查看主题。
kafka-topics.bat --list --zookeeper localhost:2181
通过以上步骤,我们能够通过Kafka设置看到生产者发送的消息以及消费者接收的消息。
在我尝试设置Kafka时,遇到了一些问题。我已将它们记录下来供参考学习。如果其他人遇到类似问题,这应该也能有所帮助:故障排除:Windows上的Kafka设置。
使用下面共享的文件和上述步骤/命令,您应该不会遇到任何问题。欢迎在下方或我的博客这里发布您的评论/问题。
- 在此处下载Windows的整个修改后的设置文件:GitHub:Kafka演示设置文件。
参考文献
- https://kafka.apache.org
- https://cwiki.apache.org/confluence/display/KAFKA
- https://docs.confluent.io/2.0.0/clients/consumer.html
历史
- 2020年8月2日:初始版本。