python操作kafka实践的示例代码


Posted in Python onJune 19, 2019

1、先看最简单的场景,生产者生产消息,消费者接收消息,下面是生产者的简单代码。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='xxxx:x')

msg_dict = {
  "sleep_time": 10,
  "db_config": {
    "database": "test_1",
    "host": "xxxx",
    "user": "root",
    "password": "root"
  },
  "table": "msg",
  "msg": "Hello World"
}
msg = json.dumps(msg_dict)
producer.send('test_rhj', msg, partition=0)
producer.close()

下面是消费者的简单代码:

from kafka import KafkaConsumer

consumer = KafkaConsumer('test_rhj', bootstrap_servers=['xxxx:x'])
for msg in consumer:
  recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
  print recv

下面是结果:

python操作kafka实践的示例代码

2、如果想要完成负载均衡,就需要知道kafka的分区机制,同一个主题,可以为其分区,在生产者不指定分区的情况,kafka会将多个消息分发到不同的分区,消费者订阅时候如果不指定服务组,会收到所有分区的消息,如果指定了服务组,则同一服务组的消费者会消费不同的分区,如果2个分区两个消费者的消费者组消费,则,每个消费者消费一个分区,如果有三个消费者的服务组,则会出现一个消费者消费不到数据;如果想要消费同一分区,则需要用不同的服务组。以此为原理,我们对消费者做如下修改:

from kafka import KafkaConsumer

consumer = KafkaConsumer('test_rhj', bootstrap_servers=['xxxx:x'])
for msg in consumer:
  recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
  print recv

然后我们开两个消费者进行消费,生产者分别往0分区和1分区发消息结果如下,可以看到,一个消费者只能消费0分区,另一个只能消费1分区:

python操作kafka实践的示例代码

python操作kafka实践的示例代码

3、kafka提供了偏移量的概念,允许消费者根据偏移量消费之前遗漏的内容,这基于kafka名义上的全量存储,可以保留大量的历史数据,历史保存时间是可配置的,一般是7天,如果偏移量定位到了已删除的位置那也会有问题,但是这种情况可能很小;每个保存的数据文件都是以偏移量命名的,当前要查的偏移量减去文件名就是数据在该文件的相对位置。要指定偏移量消费数据,需要指定该消费者要消费的分区,否则代码会找不到分区而无法消费,代码如下:

from kafka import KafkaConsumer
from kafka.structs import TopicPartition

consumer = KafkaConsumer(group_id='123456', bootstrap_servers=['10.43.35.25:4531'])
consumer.assign([TopicPartition(topic='test_rhj', partition=0), TopicPartition(topic='test_rhj', partition=1)])
print consumer.partitions_for_topic("test_rhj") # 获取test主题的分区信息
print consumer.assignment()
print consumer.beginning_offsets(consumer.assignment())
consumer.seek(TopicPartition(topic='test_rhj', partition=0), 0)
for msg in consumer:
  recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
  print recv

因为指定的便宜量为0,所以从一开始插入的数据都可以查到,而且因为指定了分区,指定的分区结果都可以消费,结果如下:

python操作kafka实践的示例代码

4、有时候,我们并不需要实时获取数据,因为这样可能会造成性能瓶颈,我们只需要定时去获取队列里的数据然后批量处理就可以,这种情况,我们可以选择主动拉取数据

from kafka import KafkaConsumer
import time

consumer = KafkaConsumer(group_id='123456', bootstrap_servers=['10.43.35.25:4531'])
consumer.subscribe(topics=('test_rhj',))
index = 0
while True:
  msg = consumer.poll(timeout_ms=5) # 从kafka获取消息
  print msg
  time.sleep(2)
  index += 1
  print '--------poll index is %s----------' % index

结果如下,可以看到,每次拉取到的都是前面生产的数据,可能是多条的列表,也可能没有数据,如果没有数据,则拉取到的为空:

python操作kafka实践的示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
Python sys.path详细介绍
Oct 17 Python
Python去掉字符串中空格的方法
Mar 11 Python
python3实现域名查询和whois查询功能
Jun 21 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
详解Python调用系统命令的六种方法
Jan 28 Python
python 详解turtle画爱心代码
Feb 15 Python
Python超详细分步解析随机漫步
Mar 17 Python
Python实现日志实时监测的示例详解
Apr 06 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 #Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 #Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 #Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 #Python
梅尔倒谱系数(MFCC)实现
Jun 19 #Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 #Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 #Python
You might like
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
深入理解React高阶组件
2017/09/28 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
Python构建网页爬虫原理分析
2017/12/19 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
Python3.4解释器用法简单示例
2019/03/22 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
python的faker库用法
2019/11/28 Python
linux面试题参考答案(6)
2014/08/29 面试题
应届生船舶驾驶求职信
2013/10/19 职场文书
化工机械应届生求职信
2013/11/04 职场文书
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
文明村镇申报材料
2014/05/06 职场文书
写给医生的感谢信
2015/01/22 职场文书
廉洁自律个人总结
2015/02/14 职场文书
小学生安全教育心得体会
2016/01/15 职场文书