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实现删除文件但保留指定文件
Jun 21 Python
Python每天必学之bytes字节
Jan 28 Python
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
python远程连接服务器MySQL数据库
Jul 02 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
Python第三方库的几种安装方式(小结)
Apr 03 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
Oct 21 Python
pycharm实现猜数游戏
Dec 07 Python
TensorFlow的自动求导原理分析
May 26 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
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
curl 出现错误的调试方法(必看)
2017/02/13 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
表单提交验证类
2006/07/14 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
Vue程序调试的方法
2019/06/17 Javascript
Python正则表达式匹配中文用法示例
2017/01/17 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
金融专业个人求职信范文
2013/11/28 职场文书
暑期社会实践方案
2014/02/05 职场文书
《老山界》教学反思
2014/04/08 职场文书
项目合作协议书范本
2014/04/16 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
活动新闻稿范文
2015/07/17 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
Win10系统下配置Java环境变量
2021/06/13 Java/Android
浅谈Java父子类加载顺序
2021/08/04 Java/Android
python实现Nao机器人的单目测距
2021/09/04 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python