python kafka 多线程消费者&手动提交实例


Posted in Python onDecember 21, 2019

官方文档:https://kafka-python.readthedocs.io/en/master/apidoc/KafkaConsumer.html

import threading
 
import os
import sys
from kafka import KafkaConsumer, TopicPartition, OffsetAndMetadata
 
from consumers.db_util import *
from consumers.json_dispose import *
from collections import OrderedDict
 
 
threads = []
# col_dic, sql_dic = get()
 
 
class MyThread(threading.Thread):
  def __init__(self, thread_name, topic, partition):
    threading.Thread.__init__(self)
    self.thread_name = thread_name
    # self.keyName = keyName
    self.partition = partition
    self.topic = topic
 
  def run(self):
    print("Starting " + self.name)
    Consumer(self.thread_name, self.topic, self.partition)
 
  def stop(self):
    sys.exit()
 
 
def Consumer(thread_name, topic, partition):
  broker_list = '172.16.90.63:6667, 172.16.90.58:6667, 172.16.90.59:6667'
  '''
  fetch_min_bytes(int) - 服务器为获取请求而返回的最小数据量,否则请等待
  fetch_max_wait_ms(int) - 如果没有足够的数据立即满足fetch_min_bytes给出的要求,服务器在回应提取请求之前将阻塞的最大时间量(以毫秒为单位)
  fetch_max_bytes(int) - 服务器应为获取请求返回的最大数据量。这不是绝对最大值,如果获取的第一个非空分区中的第一条消息大于此值,
              则仍将返回消息以确保消费者可以取得进展。注意:使用者并行执行对多个代理的提取,因此内存使用将取决于包含该主题分区的代理的数量。
              支持的Kafka版本> = 0.10.1.0。默认值:52428800(50 MB)。
  enable_auto_commit(bool) - 如果为True,则消费者的偏移量将在后台定期提交。默认值:True。
  max_poll_records(int) - 单次调用中返回的最大记录数poll()。默认值:500
  max_poll_interval_ms(int) - poll()使用使用者组管理时的调用之间的最大延迟 。这为消费者在获取更多记录之前可以闲置的时间量设置了上限。
                如果 poll()在此超时到期之前未调用,则认为使用者失败,并且该组将重新平衡以便将分区重新分配给另一个成员。默认300000
  '''
  consumer = KafkaConsumer(bootstrap_servers=broker_list,
               group_id="xiaofesi",
               client_id=thread_name,
               enable_auto_commit=False,
               fetch_min_bytes=1024*1024,#1M
               # fetch_max_bytes=1024 * 1024 * 1024 * 10,
               fetch_max_wait_ms=60000,#30s
               request_timeout_ms=305000,
               # consumer_timeout_ms=1,
               # max_poll_records=5000,
               # max_poll_interval_ms=60000 无该参数
               )
  #查出数据库上次保存的offset,此offset已经是上次消费最后一条的offset的offset+1,也就是这次消费的起始位
  dic = get_kafka(topic, partition)
  tp = TopicPartition(topic, partition)
  print(thread_name, tp, dic['offset'])
  #分配该消费者的TopicPartition,也就是topic和partition,根据参数,我是三个消费者,三个线程,每个线程消费者消费一个分区
  consumer.assign([tp])
  #重置此消费者消费的起始位
  consumer.seek(tp, dic['offset'])
  print("程序首次运行\t线程:", thread_name, "分区:", partition, "偏移量:", dic['offset'], "\t开始消费...")
  num=0 #记录该消费者消费次数
  # end_offset = consumer.end_offsets([tp])[tp]
  # print(end_offset)
  while True:
    args = OrderedDict()
    msg = consumer.poll(timeout_ms=60000)
    end_offset = consumer.end_offsets([tp])[tp]
    print('已保存的偏移量', consumer.committed(tp),'最新偏移量,',end_offset)
    if len(msg) > 0:
      print("线程:", thread_name, "分区:", partition, "最大偏移量:", end_offset, "有无数据,", len(msg))
      lines=0
      for data in msg.values():
        for line in data:
          lines+=1
          line = eval(line.value.decode('utf-8'))
          '''
          do something
          '''
      # 线程此批次消息条数
      print(thread_name,"lines",lines)
      #数据保存至数据库
      is_succeed = save_to_db(args, thread_name)
      if is_succeed:
        #更新自己保存在数据库中的各topic, partition的偏移量
        is_succeed1 = update_offset(topic, partition, end_offset)
        #手动提交偏移量 offsets格式:{TopicPartition:OffsetAndMetadata(offset_num,None)}
        consumer.commit(offsets={tp:(OffsetAndMetadata(end_offset,None))})
        print(thread_name,"to db suss",num+1)
        if is_succeed1 == 0:
          #系统退出?这个还没试
          os.exit()
          '''
          sys.exit()  只能退出该线程,也就是说其它两个线程正常运行,主程序不退出
          '''
      else:
        os.exit()
    else:
      print(thread_name,'没有数据')
    num+=1
    print(thread_name,"第",num,"次")
 
 
if __name__ == '__main__':
  try:
    t1 = MyThread("Thread-0", "test", 0)
    threads.append(t1)
    t2 = MyThread("Thread-1", "test", 1)
    threads.append(t2)
    t3 = MyThread("Thread-2", "test", 2)
    threads.append(t3)
 
    for t in threads:
      t.start()
 
    for t in threads:
      t.join()
 
    print("exit program with 0")
  except:
    print("Error: failed to run consumer program")

以上这篇python kafka 多线程消费者&手动提交实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python模拟百度登录实例详解
Jan 20 Python
Python 40行代码实现人脸识别功能
Apr 02 Python
Python连接phoenix的方法示例
Sep 29 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
python实现连连看游戏
Feb 14 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
Python远程linux执行命令实现
Nov 11 Python
Python中json.dumps()函数的使用解析
May 17 Python
Python序列类型的打包和解包实例
Dec 21 #Python
Python 使用threading+Queue实现线程池示例
Dec 21 #Python
Python CSV文件模块的使用案例分析
Dec 21 #Python
python实现的分析并统计nginx日志数据功能示例
Dec 21 #Python
Python数据持久化存储实现方法分析
Dec 21 #Python
python cv2截取不规则区域图片实例
Dec 21 #Python
Python lxml模块的基本使用方法分析
Dec 21 #Python
You might like
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php写的AES加密解密类分享
2014/06/20 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
jquery异步调用页面后台方法‏(asp.net)
2011/03/01 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
应届毕业生求职自荐书
2014/01/03 职场文书
团购业务员岗位职责
2014/03/15 职场文书
音乐教师求职信
2014/06/28 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
班主任自我评价范文
2015/03/11 职场文书
安全教育培训心得体会
2016/01/15 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server