python之kafak应用demo

本文介绍了Kafka的基础知识,包括安装步骤、依赖环境(Java)、启动Zookeeper和Kafka服务。通过Python示例展示了如何创建生产者和消费者,以及使用命令行工具创建、查看和管理topics。此外,还讲解了Kafka的分区概念,如何修改分区数以及数据存储结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用kafka之前先学习下基础知识:引用:细说 Kafka Partition 分区_性能与架构的博客-优快云博客_kafka partition

以本地为例子:

kafka版本kafka_2.12-3.2.0

1、首先安装kafka,可以通过安装包的形式 

2、进入到kafka安装的目录下的bin目录下

启动kafka,但是启动kafka需要依赖zookeeper 所以先启动zookeeper

./zookeeper-server-start.sh ../config/zookeeper.properties   不要关闭窗口

2、启动Kafka

./kafka-server-start.sh ../config/server.properties

期间启动kafka失败 java.net.ConnectException: Connection refused

缺少java环境 No Java runtime present, requesting install.

3、下载安装java环境jdk 

Apache Kafka

安装户,在重新启动kafka即可

4、开始写脚本

生产者

#!/bin/env python
# encoding=utf-8
from kafka import KafkaProducer;
import json;

producer = KafkaProducer(
    value_serializer=lambda v: json.dumps(v).encode('utf-8'),
    bootstrap_servers=['127.0.0.1:9092']
)
msg_dict = {
    "operatorId": "test",  # 公交公司ID
    "terminalId": "123",  # 设备Id
    "terminalCode": "123",  # 设备编码(使用车辆ID)
    "terminalNo": "1",  # 同一车辆内terminal序号从1开始
}

producer.send("text1", msg_dict)
producer.close()

命令的形式

bin/kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 --topic text1

# bootstrap_servers 连接的Kafka Broker 主机名称和端口号  --topic 后面是主题名

消费者

#!/bin/env python
# encoding=utf-8

from kafka import KafkaConsumer;

consumer = KafkaConsumer('text1', bootstrap_servers='127.0.0.1:9092')
for msg in consumer:
    print(msg.value.decode())

 使用分组形势

#!/bin/env python
# encoding=utf-8

from kafka import KafkaConsumer;

# text1 为只从的消费的主题topic

consumer = KafkaConsumer('text2',  bootstrap_servers='127.0.0.1:9092')

# 指定分区 group_id='123456' 指定分区,如果不指定分区,则发放的消息,会多次被消费者消费。比如成产一个消息,启动两个消费者,则会收到2个消费消息
consumer = KafkaConsumer('text2', group_id='1234567', bootstrap_servers='127.0.0.1:9092')
for msg in consumer:
    print(msg.value.decode())

执行生产者的脚本时,要保证消费者脚本是启动状态

命令行语法

bin/kafka-console-consumer.sh --bootstrap-server test1:9092 --from-beginning --topic first

参数说明描述
--bootstrap-server连接的 Kafka Broker 主机名称和端口号
--topic操作的 topic 名称
--from-beginning从头开始消费
--group指定消费者组名称

安装python插件kafka

pip install kafka

执行结果

localhost:kafka zhangweiwei$ python consumer.py
{"terminalNo": "1", "terminalCode": "123", "operatorId": "test", "terminalId": "123"}
{"terminalNo": "1", "terminalCode": "123", "operatorId": "test", "terminalId": "123"}
{"terminalNo": "1", "terminalCode": "123", "operatorId": "test", "terminalId": "123"}
{"terminalNo": "1", "terminalCode": "123", "operatorId": "test", "terminalId": "123"}

其他查看操作命令 可以查看 参数性质

 ./kafka-topics.sh

查看当前服务器中的所有topic   bin为kafka的安装包下的bin目录, 一下kafka均是在本地验证 hadoop102 可以替代为127.0.0.1

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --list     # hadoop102集群

或者bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --list   本地测试用的

创建first topic

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --partitions 1 --replication-factor 3 --topic first

创建topic时会提示: Replication factor: 3 larger than available brokers: 1. 

原因是创建的topic 服本个数大于了brokers 的数量,,修改factor 副本个数 重新执行创建,创建之前先查询下前有哪些topic

可以看到已经创建了first topic,共2个topic,text2和first

localhost:bin zhangweiwei$ ./kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --list
__consumer_offsets
text2
localhost:bin zhangweiwei$ ./kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --create --partitions 1 --replication-factor 1 --topic first
Created topic first.
localhost:bin zhangweiwei$ ./kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --list
__consumer_offsets
first
text2

 创建topic参数说明:

--topic 定义 topic 名

--replication-factor 定义副本数

--partitions 定义分区数

查看first主题的详情

 bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic first

 

修改分区数

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --alter --topic text2 --partitions 3

修改完分区后,在次查看主题详情,已经有3个分区了

 参数说明:

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic first

 删除topic

bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --delete --topic first

在生产者和消费这件还有一个broker

Broker 简介

  • Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。
    Controller:中央控制器Control,负责管理分区和副本状态并执行管理着这些分区的重新分配。(里面涉及到partition leader 选举)
    ISR:同步副本组

查看Kafka数据存储(Log)情况

partiton中文件存储方式

可以在config/server.properties 查看log存储位置

Partition是一个有序的message序列(消息队列),这些message按顺序添加到一个叫做commit log的文件中。每个partition中的消息都有一个唯一的编号,称之为offset,用来唯一标示某个分区中的message。

每个partition,都对应一个commit log文件。一个partition中的message的offset都是唯一的,但是不同的partition中的message的offset可能是相同的。
 

每个partion(目录)由多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。

partion中segment file组成和物理结构。

segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀".index"和“.log”分别表示为segment索引文件、数据文件.

  • Index文件存储大量元数据,指向对应log文件中message的物理偏移地址。
  • log数据文件存储大量消息

kafka一般不会删除消息,不管这些消息有没有被消费。只会根据配置的日志保留时间(log.retention.hours)确认消息多久被删除,默认保留最近一周的日志消息。kafka的性能与保留的消息数据量大小没有关系,因此保存大量的数据消息日志信息不会有什么影响。 

进入config/server.properties 查看log的目录 ,本次例子以/tmp/kafka-logs

cd /tmp/kafka-logs  ls 可以看到创建的text2 和first-0

 进入分区 test2

 增加分区的概念:

patition 是针对topic进行分区,目的是提高效率,负载均衡

 

Kafka 是一个高性能、分布式的消息队列,常用于处理大量的实时数据。Python-KafkaPython 语言的 Kafka 客户端库,提供了丰富的 API 接口,可以方便地对 Kafka 进行操作。下面是一个 Python-Kafka 的实战案例: 1. 安装 Python-Kafka 库 使用 pip 安装 Python-Kafka 库: ``` pip install kafka-python ``` 2. 创建 Kafka 生产者 使用 Python-Kafka 库创建 Kafka 生产者,代码如下: ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers=['localhost:9092']) for i in range(10): producer.send('test', b'message {}'.format(i)) producer.close() ``` 上述代码创建了一个 Kafka 生产者,并向名称为“test”的主题发送了 10 条消息。 3. 创建 Kafka 消费者 使用 Python-Kafka 库创建 Kafka 消费者,代码如下: ```python from kafka import KafkaConsumer consumer = KafkaConsumer('test', bootstrap_servers=['localhost:9092']) for msg in consumer: print(msg) consumer.close() ``` 上述代码创建了一个 Kafka 消费者,并订阅了名称为“test”的主题。当 Kafka 生产者向该主题发送消息时,消费者将接收到消息并打印出来。 4. 手动提交消费偏移量 默认情况下,Kafka 消费者会自动提交消费偏移量,但在某些情况下需要手动提交。例如,在消费者处理消息之前需要进行一些预处理或验证操作时,可以先手动提交偏移量,再进行处理。代码如下: ```python from kafka import KafkaConsumer consumer = KafkaConsumer('test', bootstrap_servers=['localhost:9092'], enable_auto_commit=False) for msg in consumer: print(msg) consumer.commit() consumer.close() ``` 上述代码创建了一个 Kafka 消费者,并禁用了自动提交消费偏移量的功能。在每次处理完消息后,需要手动提交偏移量。 5. 多线程消费 在实际应用中,可能需要启用多个消费者线程来提高消息处理效率。可以使用 Python 的 threading 模块创建多个线程,每个线程创建一个 Kafka 消费者来消费消息。代码如下: ```python from kafka import KafkaConsumer import threading def consume(): consumer = KafkaConsumer('test', bootstrap_servers=['localhost:9092']) for msg in consumer: print(msg) consumer.close() threads = [] for i in range(4): t = threading.Thread(target=consume) threads.append(t) t.start() for t in threads: t.join() ``` 上述代码创建了 4 个消费者线程,每个线程创建一个 Kafka 消费者并消费消息。这样可以提高消息处理效率。 以上就是一个简单的 Python-Kafka 实战案例,通过该案例可以了解如何使用 Python-Kafka 库创建 Kafka 生产者和消费者,以及如何手动提交消费偏移量和使用多线程消费。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值