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内存管理分析
Apr 08 Python
浅析Python多线程下的变量问题
Apr 28 Python
python任务调度实例分析
May 19 Python
python实现FTP服务器服务的方法
Apr 11 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
django中的setting最佳配置小结
Nov 21 Python
深入理解python中sort()与sorted()的区别
Aug 29 Python
python字符串查找函数的用法详解
Jul 08 Python
python 统计文件中的字符串数目示例
Dec 24 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 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执行速度全攻略(下)
2006/10/09 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
My Desktop :) 桌面式代码
2008/12/29 Javascript
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
现金会计岗位职责
2013/12/05 职场文书
小学新学期教师寄语
2014/01/18 职场文书
大学生求职信
2014/06/17 职场文书
退休教师追悼词
2015/06/23 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL