python之kafak应用demo

使用kafka之前先学习下基础知识:引用:细说 Kafka Partition 分区_性能与架构的博客-CSDN博客_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进行分区,目的是提高效率,负载均衡

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值