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 28 Python
python构建深度神经网络(DNN)
Mar 10 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
python是否适合网页编程详解
Oct 04 Python
python迭代器常见用法实例分析
Nov 22 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
Python列表解析操作实例总结
Feb 26 Python
pytorch 中forward 的用法与解释说明
Feb 26 Python
Python matplotlib多个子图绘制整合
Apr 13 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/12/14 PHP
PHP中使用curl入门教程
2015/07/02 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
javascript中length属性的探索
2011/07/31 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
业务经理的岗位职责
2013/11/16 职场文书
小学毕业感言300字
2014/02/19 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
英语通知范文
2015/04/22 职场文书
就业推荐表院系意见
2015/06/05 职场文书
解约证明模板
2015/06/19 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
MySQL之DML语言
2021/04/05 MySQL
详解Python中*args和**kwargs的使用
2022/04/07 Python