Kafka简介
Kafka是一个高吞吐量的分布式消息系统,由Apache软件基金会拥有和维护,它已经成为世界上最流行的开源数据处理工具之一。Kafka被许多科技巨头使用,如Uber、LinkedIn、Twitter、Netflix等,用于数据的实时处理。在我们安装Kafka之前,有必要了解它的架构和历史。
什么是Kafka?
历史
Kafka是由LinkedIn的一个工程师团队开发的。这些工程师试图解决从LinkedIn网站低延迟摄取大量事件数据的问题。
事件数据是指用户在注册网站、登录、关注他人、喜欢和分享帖子时产生的数据。这些行为被称为用户事件,像LinkedIn这样的公司跟踪用户执行的这些事件并分析数据,以获得对客户活动的洞察力,从而提高他们的保留率。LinkedIn每天都会产生大量的事件数据,他们希望能实时处理这些数据。
现有的工具,如RabbitMQ和ActiveMQ是通用的消息传递队列,支持广泛的协议,如AMQP、MQTT等。然而,这些消息传递队列在数据被消耗后并不存储。
与其他消息传递系统不同,Kafka中的消息队列是持久性的,发送的数据会被存储到指定的保留期过去。Kafka是为高吞吐量、快速和可扩展的数据流而设计的,在资源有限的情况下提供比RabbitMQ和ActiveMQ等消息经纪商高得多的性能。
Apache Kafka是一个发布-订阅消息平台,也被称为消息代理,旨在实时处理流媒体数据,并为快速和可扩展的操作提供数据。它是一个分布式流媒体平台,用于数据处理、流分析、数据存储和数据可视化。
Kafka提供了跨多个集群管理协议的能力,并将它们存储在称为主题的类别中。它为构建能够处理数十亿事件的分布式应用提供了一个强大的平台。
Kafka被用于捕捉大数据和实时分析的各种应用,包括数据挖掘、分析、数据可视化和机器学习。
什么是发布-订阅消息系统?
发布-订阅消息传递是一种通信方法,其中消息在发送方和接收方之间交换,他们都不知道对方的身份。换句话说,发送者(也叫发布者或生产者)和接收者(也叫订阅者或消费者)是相互独立的,并且是松散耦合的。在这个系统中,消息是持久的,并有很高的处理能力。
与点对点系统不同的是,一个特定的消息只能被一个消费者消费,在这种模式下,消费者可以订阅一个或多个主题,并消费该主题的所有消息。

架构和术语
在Kafka中,数据被称为消息。换句话说,消息指的是一个包含一些信息的字节流或数组。这些是我们需要牢记的一些Kafka术语。
- 主题
主题是给一个类别或feed的名称或唯一的ID,记录流或消息被发送到这个类别或feed。
在Kafka中,主题可以有零个或更多的消费者来接收写给它的数据。例如,如果我们想发送有关股票的信息,我们可以创建一个名为 "股票 "的话题,多个生产者可以向该话题发送消息。该主题也可以有多个消费者收集关于股票价格的信息。
- 经纪人
经纪人,也叫Kafka节点或Kafka服务器,负责在生产者和消费者之间提供便利。他们充当 "中间人",存储生产者发送的数据,并允许消费者在一个主题中获取消息。
在一个有多个生产者和消费者相互作用的Kafka集群中,经纪人是必不可少的,他们扮演着 "负载平衡器 "的角色。经纪人可以有多个主题分区,这些分区可以是一个领导者,也可以是一个副本(一条消息被复制多次以提供容错)。领头羊负责对一个主题的所有写入和读取,并与其他副本协调。如果领导者发生了什么事,或者它无法运作,一个副本就会成为新的领导者,从而提供容错性。
生产者
生产者是产生数据并发布或发送消息到Kafka经纪人的一个或多个主题的应用程序。他们不直接向收件人发送消息。例如,如果一个生产者生成了股票数据,它可以通过经纪人将这些数据写入一个名为 "股票 "的主题。
消费者
消费者是可以从他们在经纪商中订阅的一个或多个主题读取或接收数据的应用程序。例如,如果生产者向一个名为 "股票 "的主题写入数据,消费者可以订阅该主题,并通过经纪人从该主题中提取所有消息。
集群
当Kafka在一个有多个节点共同工作的分布式系统中使用时,它显示了其真正的潜力。一个Kafka集群是由两个或更多的经纪人节点组成的集合。这些集群管理各种活动,可以有效地分配负载,因此,提供高吞吐量和高可用性。
生产者以固定的时间间隔向一个特定的Kafka主题发送数据,经纪人将这些消息存储在不同的分区。消费者可以订阅一个特定的主题,并可以通过经纪人消费消息。Zookeeper在Kafka经纪人和持续消费数据的消费者之间进行协调。
Zookeeper帮助跟踪各种分区、主题以及它们存储在哪个节点上,这样消费者就可以很容易地检索到某个主题或消息的位置。Kafka通过使用偏移量来跟踪被发送给消费者的消息。偏移量是给存储在分区中的消息的唯一ID。第一条消息的偏移量是0,第二条消息的偏移量是1,以此类推。如果一个消费者停止消费消息,Kafka会存储最近发送给消费者的偏移量。一旦消费者恢复拉取数据,Kafka会简单地发送带有下一个偏移值的消息,并恢复操作。

安装
Kafka需要在你的系统上安装Java(OpenJDK 8)。按照这个教程来安装java。
-
Kafka使用Zookeeper。因此,我们首先需要在系统上安装Zookeeper。从官方网站下载Zookeeper
-
解压tar文件。
tar -zxf <zookeeper version>
-
从官方网站上下载Kafka
-
将tar文件移动到你系统中任何方便的位置。
-
通过运行以下命令提取tar文件。
tar -xzf <kafka version that you downloaded>
你已经成功地在你的系统上安装了Kafka。
在Python中设置一个Kafka生产者和消费者
让我们使用kafka-python模块建立一个简单的Kafka管道,它允许我们与Kafka通信。要安装kafka-python,在终端上运行以下命令。
# To install it on python3
sudo pip3 install kafka-python
# To install it on python2
sudo pip install kafka-python
- 导航到Kafka文件夹,通过在终端上运行以下命令来启动Zookeeper。
bin/zookeeper-server-start.sh config/zookeeper.properties
- 打开另一个终端,启动Kafka服务器或代理。
bin/kafka-server-start.sh config/server.properties
- 在另一个终端上创建一个Kafka主题。我将通过运行以下命令创建一个名为 "test "的主题。
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
这将创建一个名为 "test "的话题,在2181端口上有1个副本和1个分区,在我们的localhost上运行。我们可以通过运行以下命令看到一个主题列表。
bin/kafka-topics.sh --list --zookeeper localhost:2181
- 创建一个名为consumer.py的文件并添加以下代码。
from kafka import KafkaConsumer
# create a consumer that consumes messages from the topic called "test"
consumer = KafkaConsumer('test', bootstrap_servers=['localhost:9092'])
# print the message received by the consumer
for message in consumer:
print (message)
打开一个新的终端并运行。
python3 consumer.py
- 创建 producer.py,向消费者发送 "Hello world"。
from kafka import KafkaProducer
# create a producer
producer = KafkaProducer(bootstrap_servers=['localhost:9092'])
producer.send('test', b'Hello world')
打开一个新的终端并运行。
python3 producer.py
你会看到终端上显示 "Hello world"。