安装zookeeper
在本地创建一个文件夹path/zookeeper
用于容器的路径映射(因人而异,记得替换)
docker run -d -p 2181:2181 -v path/zookeeper:/data -v /etc/localtime:/etc/localtime --name zookeeper --restart always zookeeper
安装kafka
wurstmeister/kafka
是比较常见的 kafka 镜像,这里以wurstmeister/kafka:2.12-2.5.0
版本为例,介绍如何安装 kafka
docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka -p 9002:9002 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT={your_ip_address}:2181/kafka \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{your_ip_address}:9002 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9002 \
-v /etc/localtime:/etc/localtime \
wurstmeister/kafka:2.12-2.5.0
各参数含义如下:
# -e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
# -e KAFKA_ZOOKEEPER_CONNECT={your_ip_address}:2181/kafka 配置zookeeper管理kafka的路径
# -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{your_ip_address}:9002 把kafka的地址端口注册给zookeeper
# -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9002 配置kafka的监听端口
# -v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间
测试
进入 kafka 容器,并进入到bin
目录下
docker exec -it {container_id} /bin/bash && cd /opt/kafka_2.12-2.5.0/bin
创建一个新主题(test-kafka)来存储事件
./kafka-topics.sh --create --topic test-kafka --bootstrap-server localhost:9002
查看创建的新主题(test-kafka)
./kafka-topics.sh --describe --topic test-kafka --bootstrap-server localhost:9002
测试消费信息
./kafka-console-consumer.sh --topic test-kafka --from-beginning --bootstrap-server localhost:9002
测试生产信息:运行kafka-console-producer.sh
并输入一段文字,检查消费者的终端是否显示了相应的内容
./kafka-console-producer.sh --topic test-kafka --bootstrap-server localhost:9002
Kafka 中的生产者和消费者是消息传递系统的两个核心组件:
生产者 (Producer)
生产者是负责将消息发布到 Kafka 主题的客户端。生产者将消息发送到 Kafka 服务器,服务器再将消息存储在对应的主题分区中。生产者可以通过指定消息的键来决定消息被存储到哪个分区(如果未指定,则使用轮询或其他分区策略)。
主要特点:
- 高吞吐量:Kafka 生产者设计用于处理大量数据,可以实现高吞吐量的消息传输。
- 可靠性:生产者支持不同的可靠性级别,可以根据需要配置消息的确认机制(例如,等待 leader 的确认、所有副本的确认等)。
- 负载均衡:生产者可以自动将消息负载均衡地分配到主题的不同分区中。
- 批处理:为了提高效率,生产者可以批量发送消息。
消费者 (Consumer)
消费者是负责从 Kafka 主题中读取消息的客户端。消费者订阅一个或多个主题,并从中读取数据。消费者可以是独立的,也可以是消费者组的一部分。在消费者组中,每个消费者负责读取分区的一部分数据,以实现高效的数据处理。
主要特点:
- 消费组:消费者可以组成消费组,组内的消费者共同消费一个主题的消息,每个消费者负责消费一部分分区的数据,这样可以实现消息的并行处理。
- 自动偏移管理:消费者可以自动跟踪已经消费的消息的偏移量,以便在失败或重新启动时从上次消费的位置继续消费。
- 消息回溯:消费者可以重新设置偏移量,以便从旧的消息开始消费,实现消息的回溯处理。
- 负载均衡:在消费者组中,如果消费者的数量发生变化(例如,新的消费者加入或现有消费者离开),Kafka 会自动重新分配分区以平衡负载。
Kafka-python
接下来介绍如何使用 python 的 kafka 库实现:生产者读取本地文档中的内容并以流的形式发送到 kafka 主题,消费者从 kafka 主题接收数据流并输出。(注:代码中的 ip 地址注意替换)
库安装
pip3 install kafka-python
生产者
from kafka import KafkaProducer
import time
# 创建Kafka生产者
producer = KafkaProducer(bootstrap_servers='{your_ip_address}:9002')
# 读取本地数据文件
with open('doc.txt', 'r') as file:
for line in file:
# 发送数据到Kafka主题
producer.send('test-kafka', line.encode('utf-8'))
# 设置发送间隔
time.sleep(1)
消费者
from kafka import KafkaConsumer
# 创建Kafka消费者
consumer = KafkaConsumer('test-kafka', bootstrap_servers='{your_ip_address}:9002')
# 消费数据
for message in consumer:
print(f"Received message: {message.value.decode('utf-8')}")