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接收Gmail新邮件并发送到gtalk的方法
Mar 10 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
Python 一句话生成字母表的方法
Jan 02 Python
Python+OpenCV图片局部区域像素值处理改进版详解
Jan 23 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
python 模拟银行转账功能过程详解
Aug 06 Python
python基于gevent实现并发下载器代码实例
Nov 01 Python
python同时遍历两个list用法说明
May 02 Python
python安装和pycharm环境搭建设置方法
May 27 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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保存带BOM文件的方法
2015/02/12 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
python中pyqtgraph知识点总结
2021/01/26 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
班主任新年寄语
2014/04/04 职场文书
借款协议书
2014/04/12 职场文书
灰雀教学反思
2014/04/28 职场文书
厂区绿化方案
2014/05/08 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技