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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
原生python实现knn分类算法
Oct 24 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
浅谈Python中的继承
Jun 19 Python
Python 实现集合Set的示例
Dec 21 Python
Python 如何安装Selenium
May 06 Python
Python基础之函数嵌套知识总结
May 23 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 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
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
Python中time模块和datetime模块的用法示例
2016/02/28 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
python numpy 反转 reverse示例
2019/12/04 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
德国团购网站:Groupon德国
2018/03/13 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
数据库面试要点基本概念
2013/10/31 面试题
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
预防煤气中毒方案
2014/06/16 职场文书
宿舍标语大全
2014/06/19 职场文书
实习工作表现评语
2014/12/31 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书