python 消费 kafka 数据教程


Posted in Python onDecember 21, 2019

1.安装python模块

pip install --user kafka-python==1.4.3

如果报错压缩相关的错尝试安装下面的依赖

yum install snappy-devel
yum install lz4-devel
pip install python-snappy
pip install lz4

2.生产者

#!/usr/bin/env python
# coding : utf-8

from kafka import KafkaProducer
import json

def kafkaProducer():
  producer = KafkaProducer(bootstrap_servers='ip:9092',value_serializer=lambda v: json.dumps(v).encode('utf-8'))
  producer.send('world', {'key1': 'value1'})

if __name__ == '__main__':
  kafkaProducer()

2.消费者

from kafka import KafkaConsumer
from kafka.structs import TopicPartition
import time
import click
import ConfigParser
import json
import threading
import datetime
import sched


config = ConfigParser.ConfigParser()
config.read("amon.ini")

@click.group()
def cli():
  pass

@cli.command()
@click.option('--topic',type=str)
@click.option('--offset', type=click.Choice(['smallest', 'earliest', 'largest']))
@click.option("--group",type=str)
def client(topic,offset,group):
  click.echo(topic)
  consumer = KafkaConsumer(topic,
               bootstrap_servers=config.get("KAFKA", "Broker_Servers").split(","),
               group_id=group,
               auto_offset_reset=offset)
  for message in consumer:
    click.echo(message.value)
    # click.echo("%d:%d: key=%s value=%s" % (message.partition,
    #                      message.offset, message.key,
    #                      message.value))

if __name__ == '__main__':
  cli()

3.多线程消费

#coding:utf-8
import threading

import os
import sys
from kafka import KafkaConsumer, TopicPartition, OffsetAndMetadata
from collections import OrderedDict


threads = []


class MyThread(threading.Thread):
  def __init__(self, thread_name, topic, partition):
    threading.Thread.__init__(self)
    self.thread_name = thread_name
    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 = 'ip1:9092,ip2:9092'

  '''
  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="test000001",
               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,
               )
  # 设置topic partition
  tp = TopicPartition(topic, partition)
  # 分配该消费者的TopicPartition,也就是topic和partition,根据参数,每个线程消费者消费一个分区
  consumer.assign([tp])
  #获取上次消费的最大偏移量
  offset = consumer.end_offsets([tp])[tp]
  print(thread_name, tp, offset)

  # 设置消费的偏移量
  consumer.seek(tp, offset)

  print u"程序首次运行\t线程:", thread_name, u"分区:", partition, u"偏移量:", offset, u"\t开始消费..."
  num = 0 # 记录该消费者消费次数
  while True:
    msg = consumer.poll(timeout_ms=60000)
    end_offset = consumer.end_offsets([tp])[tp]
    '''可以自己记录控制消费'''
    print u'已保存的偏移量', consumer.committed(tp), u'最新偏移量,', end_offset
    if len(msg) > 0:
      print u"线程:", thread_name, u"分区:", partition, u"最大偏移量:", end_offset, u"有无数据,", len(msg)
      lines = 0
      for data in msg.values():
        for line in data:
          print line
          lines += 1
        '''
        do something
        '''
      # 线程此批次消息条数

      print(thread_name, "lines", lines)
      if True:
        # 可以自己保存在各topic, partition的偏移量
        # 手动提交偏移量 offsets格式:{TopicPartition:OffsetAndMetadata(offset_num,None)}
        consumer.commit(offsets={tp: (OffsetAndMetadata(end_offset, None))})
        if True == 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")

参考:https://kafka-python.readthedocs.io/en/master/index.html

以上这篇python 消费 kafka 数据教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 多线程应用介绍
Dec 19 Python
python修改字典内key对应值的方法
Jul 11 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
Python字符串和字典相关操作的实例详解
Sep 23 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
python kafka 多线程消费者&手动提交实例
Dec 21 #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
You might like
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
javascript new一个对象的实质
2010/01/07 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
React如何实现浏览器打印部分内容详析
2019/05/19 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
python聊天程序实例代码分享
2013/11/18 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
利用python绘制正态分布曲线
2021/01/04 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
PHP面试题大全
2015/10/16 面试题
历史系毕业生自荐信
2013/10/28 职场文书
土木工程应届生求职信
2013/10/31 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
葬礼主持词
2015/07/02 职场文书