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使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
python图像处理之反色实现方法
May 30 Python
python八大排序算法速度实例对比
Dec 06 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
对python 匹配字符串开头和结尾的方法详解
Oct 27 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
python logging添加filter教程
Dec 24 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
Python实战之疫苗研发情况可视化
May 18 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
深入extjs与php参数交互的详解
2013/06/25 PHP
PHP常用的小程序代码段
2015/11/14 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
使用jquery实现放大镜效果
2014/09/02 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
vue实现学生信息管理系统
2020/05/30 Javascript
Python生成随机密码的方法
2017/06/16 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
keras中的卷积层&池化层的用法
2020/05/22 Python
.net面试题
2016/09/17 面试题
计算机科学与技术应届生求职信
2013/11/07 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
环保建议书300字
2014/05/14 职场文书
东京审判观后感
2015/06/01 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸