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()
相关推荐
霸道流氓气质7 小时前
分布式系统设计:技术解析与实践
分布式
ACP广源盛139246256739 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
汽车仪器仪表相关领域13 小时前
KRYPTON坚固型IP67 EtherCAT总线数据采集模块:工业级分布式采集方案
分布式·功能测试·汽车·压力测试·可用性测试
霸道流氓气质15 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
naierfengdian17 小时前
分布式风电助力乡村能源转型的技术路径
分布式·能源
霸道流氓气质18 小时前
RedLock:Redis 分布式锁的高可用方案
数据库·redis·分布式
DLYSB_18 小时前
Kafka 消费倾斜死锁与 Partition 掉队:我用 Rust 写了个“数据管道物理哨兵”,比 Grafana 报警快了 18 秒
rust·kafka·grafana·报警灯
hhzz18 小时前
《深度学习框架PyTorch入门与实践》系列:09-分布式与并行训练之DataParallel、DDP与Horovod
pytorch·分布式·深度学习
creator_Li19 小时前
Kafka消费者offset提交
kafka
TDengine (老段)20 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine