环境配置
- kafka及Zookeeper的安装
- kafka-python包的安装
pip install kafka-python
kafka-python的基本使用
- 消费者
from kafka import KafkaConsumer
consumer = KafkaConsumer('test', bootstrap_servers= ['localhost:9092'])
for msg in consumer:
print(msg)
- 第1个参数为 topic的名称
- bootstrap_servers : 指定kafka服务器
- 生产者
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代替
- 发送或接收的消息解析
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