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发送arp欺骗攻击代码分析
Jan 16 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
python fabric实现远程部署
Jan 05 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
Numpy一维线性插值函数的用法
Apr 22 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
Python3 如何开启自带http服务
May 18 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
图书管理程序(二)
2006/10/09 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
2018/09/19 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
模具专业推荐信
2013/10/30 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
学校交通安全责任书
2014/08/25 职场文书
银行稽核岗位职责
2015/04/13 职场文书
文艺晚会开场白
2015/05/29 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
Java实现学生管理系统(IO版)
2022/02/24 Java/Android