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导出DBF文件到Excel的方法
Jul 25 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
Python 通过打码平台实现验证码的实现
May 13 Python
深入了解Django View(视图系统)
Jul 23 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 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数据缓存的使用说明
2013/05/10 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
validator验证控件使用代码
2010/11/23 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
Python实现基于POS算法的区块链
2018/08/07 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python内存动态分配过程详解
2019/07/15 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
Django models文件模型变更错误解决
2020/05/11 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
为什么要有struct关键字
2012/05/08 面试题
传播学专业毕业生自荐信
2013/11/04 职场文书
党员公开承诺书
2014/03/25 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
500字作文之周记
2019/12/13 职场文书