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正则表达式操作指南(re使用)
Sep 06 Python
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
python创建临时文件夹的方法
Jul 06 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
pytorch进行上采样的种类实例
Feb 18 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
如何在python中处理配置文件代码实例
Sep 27 Python
python实现网页录音效果
Oct 26 Python
Python pandas之求和运算和非空值个数统计
Aug 07 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结合web uploader插件实现分片上传文件
2016/05/10 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
express启用https使用小记
2019/05/21 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Python中的rfind()方法使用详解
2015/05/19 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
基于Python的PIL库学习详解
2019/05/10 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
运动会班级口号
2014/06/09 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
时尚女魔头观后感
2015/06/04 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
Python中npy和mat文件的保存与读取
2022/04/24 Python