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中的闭包总结
Sep 18 Python
简洁的十分钟Python入门教程
Apr 03 Python
python安装Scrapy图文教程
Aug 14 Python
Python装饰器的执行过程实例分析
Jun 04 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 Python
Python加密技术之RSA加密解密的实现
Apr 08 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验证复选框有效性的示例
2013/11/13 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
JS实现520 表白简单代码
2018/05/21 Javascript
js input输入百分号保存数据库失败的解决方法
2018/05/26 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
EJB与JAVA BEAN的区别
2016/08/29 面试题
环境工程专业自荐信范文
2014/03/18 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
投标单位介绍信
2015/05/05 职场文书
学生会干部任命书
2015/09/21 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python