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 参数列表中的self 显式不等于冗余
Dec 01 Python
python高并发异步服务器核心库forkcore使用方法
Nov 26 Python
Python3写入文件常用方法实例分析
May 22 Python
python提取页面内url列表的方法
May 25 Python
python多进程实现进程间通信实例
Nov 24 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 17 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
分享常见的几种页面静态化的方法
2015/01/08 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
validator验证控件使用代码
2010/11/23 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
python3.5使用tkinter制作记事本
2016/06/20 Python
python线程池threadpool实现篇
2018/04/27 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
简述数组与指针的区别
2014/01/02 面试题
校园十佳歌手策划书
2014/01/22 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
小浪底导游词
2015/02/12 职场文书
实验心得体会范文
2016/01/25 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
php去除数组中为0的元素的实例分析
2021/11/17 PHP