Kafka的安装与使用(windows下python使用等)

一、下载

可以去官网下载:https://kafka.apache.org/downloads

版本可选择,建议下载比较新的,新版本里面自带zookeeper

二、安装

创建一个目录,此处是D:\kafka,将文件放进去解压

如果文件后缀是gz,解压后没有文件夹,此时需要先将文件后缀修改为tgz,然后再解压

进入kafka目录,创建一个data和log目录,用作zookeeper和kafka的数据和日志目录

三、修改配置

1.修改zookeeper的配置,使用编译器打开 config文件夹下面的zookeeper.properties文件,然后修改

dataDir,这个值改为自己刚才创建的data目录地址,使用\\连接

clientPort=2181

修改后,确认保存

2.修改kafka配置文件,打开config文件夹下的server.properties文件,修改内容

port,9092是默认的端口号

host.name,修改为自己的IP,一般是本机或者局域网IP

listeners,修改为自己的IP和端口

log.dirs,填写为自己刚才创建的log文件夹,\\连接

zookeeper.connect=127.0.0.1:2181,这个根据自己情况写IP和端口,上面配置的

四、启动服务

1.启动zookeeper服务

先进入kafka解压后的根目录,然后在cmd里面执行如下命令:

复制代码
bin\windows\zookeeper-server-start.bat config\zookeeper.properties

2.启动kafka

先进入kafka解压后的根目录,然后在cmd里面执行如下命令:

复制代码
bin\windows\kafka-server-start.bat config\server.properties

温馨提示:如果kafka没有正常关闭,可能下一次启动就会报错,可以删除data,log和logs目录里面的内容之后,再从启动zookeeper开始往下走

3.创建topic

创建一个test_topic

复制代码
bin\windows\kafka-topics.bat --create --topic test_topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

4.查看topic列表

复制代码
.\bin\windows\kafka-topics.bat --list --bootstrap-server localhost:9092

5.启动producer生产者

如果使用代码去创建生产者和消费者此步骤不需要

假设你要向名为 test_topic 的主题发送消息,并且 Kafka 代理地址是 localhost:9092,可以运行以下命令:

复制代码
.\bin\windows\kafka-console-producer.bat --topic test_topic --bootstrap-server localhost:9092

启动后进入输入模式,等待生产者输入,输入测试的123,234

6.启动customer消费者

如果使用代码去创建生产者和消费者此步骤不需要

复制代码
.\bin\windows\kafka-console-consumer.bat --topic test_topic --bootstrap-server localhost:9092 --from-beginning

启动后,可以看到生产者发送的内容:

五、Python代码实现生产者和消费者

复制代码
pip install kafka-python

模拟生产者代码,通过输入进行内容控制:

复制代码
import uuid

from kafka import KafkaProducer
import json
import time

# 配置 Kafka 生产者
producer = KafkaProducer(
    bootstrap_servers=['127.0.0.1:9092'],
    value_serializer=lambda v: json.dumps(v).encode('utf-8')
)

# 要发送的主题名称
topic = 'test_topic'

try:
    while True:
        content = input("内容:")
        message = {
            'id': uuid.uuid4().hex,
            'message': f'{content}'
        }
        # 发送消息
        future = producer.send(topic, value=message)
        # 等待消息发送结果
        result = future.get(timeout=10)
        print(f"Sent message {content} to partition {result.partition} at offset {result.offset}")

except Exception as e:
    print(f"Error sending message: {e}")
finally:
    # 刷新缓冲区并关闭生产者
    producer.flush()
    producer.close()

消费者模拟:

复制代码
from kafka import KafkaConsumer
import json

# 配置 Kafka 消费者
consumer = KafkaConsumer(
    'test_topic',
    bootstrap_servers=['127.0.0.1:9092'],
    value_deserializer=lambda m: json.loads(m.decode('utf-8')),
    auto_offset_reset='earliest'
)

try:
    # 持续消费消息
    for message in consumer:
        print(f"Received message: {message.value} from partition {message.partition} at offset {message.offset}")
except KeyboardInterrupt:
    print("Consumer interrupted by user.")
finally:
    # 关闭消费者
    consumer.close()

在生产者输入 hello,yes进行测试:

在消费者代码出进行获取:

注意消费者的message本身就是一个可迭代对象,是无穷尽的。

并且**auto_offset_reset**参数控制了是从第一个开始获取还是从接入的时候再算起,移除参数就代表从接入开始获取message里面的数据,如果是 earliest 就会从第一个开始获取,即使已经处理了!

那么,如果是消费者掉线,生产者在掉线期间新增了若干条数据,如何让消费者上线后从没有处理的数据开始处理呢?可以给消费者设置三个参数并且手动commit:

复制代码
auto_offset_reset='earliest',  # 从最新的消息位置开始消费
enable_auto_commit=False,  # 开启自动提交偏移量
group_id='aaa'

参考代码:

复制代码
from kafka import KafkaConsumer
import json

# 配置 Kafka 消费者
consumer = KafkaConsumer(
    'test_topic',
    bootstrap_servers=['127.0.0.1:9092'],
    value_deserializer=lambda m: json.loads(m.decode('utf-8')),
    auto_offset_reset='earliest',  # 从最新的消息位置开始消费
    enable_auto_commit=False,  # 关闭自动提交偏移量
    group_id='aaa'
)

try:
    # 持续消费消息
    for message in consumer:
        print(f"Received message: {message.value} from partition {message.partition} at offset {message.offset}")
        consumer.commit()  # 手动提交偏移量
except KeyboardInterrupt:
    print("Consumer interrupted by user.")
finally:
    # 关闭消费者
    consumer.close()
相关推荐
難釋懷10 小时前
分布式锁的原子性问题
分布式
ai_xiaogui11 小时前
【开源前瞻】从“咸鱼”到“超级个体”:谈谈 Panelai 分布式子服务器管理系统的设计架构与 UI 演进
服务器·分布式·架构·分布式架构·panelai·开源面板·ai工具开发
凯子坚持 c12 小时前
如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器
分布式
飞升不如收破烂~12 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式
无心水12 小时前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
Lansonli13 小时前
大数据Spark(八十):Action行动算子fold和aggregate使用案例
大数据·分布式·spark
闻哥13 小时前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
invicinble14 小时前
对于分布式的原子能力
分布式
心态还需努力呀1 天前
CANN仓库通信库:分布式训练的梯度压缩技术
分布式·cann