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 ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python库urllib与urllib2主要区别分析
Jul 13 Python
Python类的动态修改的实例方法
Mar 24 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
python读取中文txt文本的方法
Apr 12 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
Python解决走迷宫问题算法示例
Jul 27 Python
python对常见数据类型的遍历解析
Aug 27 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
Python requests及aiohttp速度对比代码实例
Jul 16 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 Python
详解python对象之间的交互
Sep 29 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连接数据库代码应用分析
2011/05/29 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
PHPUnit安装及使用示例
2014/10/29 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
javascript里的条件判断
2007/02/27 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
jquery禁用右键示例
2014/04/28 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
2015年元旦促销方案书
2014/12/09 职场文书
2015年妇女工作总结
2015/05/14 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书