kafka-python的简单使用

235 阅读2分钟

环境配置

  1. kafka及Zookeeper的安装

kafka基本信息

  1. kafka-python包的安装

pip install kafka-python

kafka-python的基本使用

  1. 消费者
from kafka import KafkaConsumer

consumer = KafkaConsumer('test', bootstrap_servers= ['localhost:9092'])
for msg in consumer:
    print(msg)
  • 第1个参数为 topic的名称
  • bootstrap_servers : 指定kafka服务器
  1. 生产者
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers=['localhost:9092'])
sent_msg = producer.send('test' , key= b'my_key', value= b'my_value', partition= 0)
result = sent_msg.get(timeout= 10)
print(result)

producer.send函数为发送消息

  • 第1个参数为 topic名称,必须指定
  • key : 键,必须是字节字符串,可以不指定(但key和value必须指定1个),默认为None
  • value : 值,必须是字节字符串,可以不指定(但key和value必须指定1个),默认为None
  • partition : 指定发送的partition,由于kafka默认配置1个partition,固为0

sent_msg.get函数等待单条消息发送完成或超时,经测试,必须有这个函数,不然发送不出去,或用time.sleep代替

  1. 发送或接收的消息解析
ConsumerRecord(topic='test', partition=0, offset=4, timestamp=1529569531392, timestamp_type=0, key=b'my_value', value=None, checksum=None, serialized_key_size=8, serialized_value_size=-1)
  • topic
  • partition
  • offset : 这条消息的偏移量
  • timestamp : 时间戳
  • timestamp_type : 时间戳类型
  • key : key值,字节类型
  • value : value值,字节类型
  • checksum : 消息的校验和
  • serialized_key_size : 序列化key的大小
  • serialized_value_size : 序列化value的大小,可以看到value=None时,大小为-1

传递json数据

编码(生产者):value_serializer

解码(消费者):value_deserializer

1.producer发送的json数据

from kafka import KafkaProducer
import json

producer = KafkaProducer(bootstrap_servers=['localhost:9092'], value_serializer=lambda m: json.dumps(m).encode('ascii'))
send_msg = producer.send('test2' ,  value= {'value_1' : 'value_2'}, partition= 0)
send_msg.get(timeout= 10)

2.consumer没有解码收到的数据

ConsumerRecord(topic='test2', partition=0, offset=22, timestamp=1529575016310, timestamp_type=0, key=N

此时value为原始的json

3.consumer自动解码

from kafka import KafkaConsumer
import json

consumer = KafkaConsumer(group_id= 'group2', bootstrap_servers= ['localhost:9092'], value_deserializer=lambda m: json.loads(m.decode('ascii')))
consumer.subscribe(topics= ['test2', 'test3'])
for msg in consumer:
    print(msg)

接收结果:

ConsumerRecord(topic='test2', partition=0, offset=23, timestamp=1529575235994, timestamp_type=0, key=None, value={'value_1': 'value_2'}, checksum=None, serialized_key_size=-1, serialized_value_size=22)
  • 可以看到接收结果中,value已经自动解码,并为字符串类型
  • 不仅value可以json,key也可以,只需指定 key_deserializer