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开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
python根据txt文本批量创建文件夹
Dec 08 Python
用pycharm开发django项目示例代码
Jun 13 Python
Django模板Templates使用方法详解
Jul 19 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
python实现随机加减法生成器
Feb 24 Python
python中判断文件结束符的具体方法
Aug 04 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 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修改Linux或Unix口令的方法分享
2012/01/30 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
Python跳出循环语句continue与break的区别
2014/08/25 Python
python读取LMDB中图像的方法
2018/07/02 Python
详解Python:面向对象编程
2019/04/10 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
3种python调用其他脚本的方法
2020/01/06 Python
Python随机数函数代码实例解析
2020/02/09 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
业务员自荐信范文
2014/04/20 职场文书
主题实践活动总结
2014/05/08 职场文书
护士实习自荐信
2015/03/06 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
刮痧观后感
2015/06/05 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers