使用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
安装户,在重新启动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进行分区,目的是提高效率,负载均衡