python消费kafka数据批量插入到es的方法


Posted in Python onDecember 27, 2018

1、es的批量插入

这是为了方便后期配置的更改,把配置信息放在logging.conf中

用elasticsearch来实现批量操作,先安装依赖包,sudo pip install Elasticsearch2

from elasticsearch import Elasticsearch 
class ImportEsData:

  logging.config.fileConfig("logging.conf")
  logger = logging.getLogger("msg")

  def __init__(self,hosts,index,type):
    self.es = Elasticsearch(hosts=hosts.strip(',').split(','), timeout=5000)
    self.index = index
    self.type = type


  def set_date(self,data): 
    # 批量处理 
    # es.index(index="test-index",doc_type="test-type",id=42,body={"any":"data","timestamp":datetime.now()})
    self.es.index(index=self.index,doc_type=self.index,body=data)

2、使用pykafka消费kafka

1.因为kafka是0.8,pykafka不支持zk,只能用get_simple_consumer来实现

2.为了实现多个应用同时消费而且不重消费,所以一个应用消费一个partition

3. 为是确保消费数据量在不满足10000这个批量值,能在一个时间范围内插入到es中,这里设置consumer_timeout_ms一个超时等待时间,退出等待消费阻塞。

4.退出等待消费阻塞后导致无法再消费数据,因此在获取self.consumer 的外层加入了while True 一个死循环

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from pykafka import KafkaClient
import logging
import logging.config
from ConfigUtil import ConfigUtil
import datetime


class KafkaPython:
  logging.config.fileConfig("logging.conf")
  logger = logging.getLogger("msg")
  logger_data = logging.getLogger("data")

  def __init__(self):
    self.server = ConfigUtil().get("kafka","kafka_server")
    self.topic = ConfigUtil().get("kafka","topic")
    self.group = ConfigUtil().get("kafka","group")
    self.partition_id = int(ConfigUtil().get("kafka","partition"))
    self.consumer_timeout_ms = int(ConfigUtil().get("kafka","consumer_timeout_ms"))
    self.consumer = None
    self.hosts = ConfigUtil().get("es","hosts")
    self.index_name = ConfigUtil().get("es","index_name")
    self.type_name = ConfigUtil().get("es","type_name")


  def getConnect(self):
    client = KafkaClient(self.server)
    topic = client.topics[self.topic]
    p = topic.partitions
    ps={p.get(self.partition_id)}

    self.consumer = topic.get_simple_consumer(
      consumer_group=self.group,
      auto_commit_enable=True,
      consumer_timeout_ms=self.consumer_timeout_ms,
      # num_consumer_fetchers=1,
      # consumer_id='test1',
      partitions=ps
      )
    self.starttime = datetime.datetime.now()


  def beginConsumer(self):
    print("beginConsumer kafka-python")
    imprtEsData = ImportEsData(self.hosts,self.index_name,self.type_name)
    #创建ACTIONS 
    count = 0
    ACTIONS = [] 

    while True:
      endtime = datetime.datetime.now()
      print (endtime - self.starttime).seconds
      for message in self.consumer:
        if message is not None:
          try:
            count = count + 1
            # print(str(message.partition.id)+","+str(message.offset)+","+str(count))
            # self.logger.info(str(message.partition.id)+","+str(message.offset)+","+str(count))
            action = { 
              "_index": self.index_name, 
              "_type": self.type_name, 
              "_source": message.value
            }
            ACTIONS.append(action)
            if len(ACTIONS) >= 10000:
              imprtEsData.set_date(ACTIONS)
              ACTIONS = []
              self.consumer.commit_offsets()
              endtime = datetime.datetime.now()
              print (endtime - self.starttime).seconds
              #break
          except (Exception) as e:
            # self.consumer.commit_offsets()
            print(e)
            self.logger.error(e)
            self.logger.error(str(message.partition.id)+","+str(message.offset)+","+message.value+"\n")
            # self.logger_data.error(message.value+"\n")
          # self.consumer.commit_offsets()


      if len(ACTIONS) > 0:
        self.logger.info("等待时间超过,consumer_timeout_ms,把集合数据插入es")
        imprtEsData.set_date(ACTIONS)
        ACTIONS = []
        self.consumer.commit_offsets()




  def disConnect(self):
    self.consumer.close()


from elasticsearch import Elasticsearch 
from elasticsearch.helpers import bulk
class ImportEsData:

  logging.config.fileConfig("logging.conf")
  logger = logging.getLogger("msg")

  def __init__(self,hosts,index,type):
    self.es = Elasticsearch(hosts=hosts.strip(',').split(','), timeout=5000)
    self.index = index
    self.type = type


  def set_date(self,data): 
    # 批量处理 
    success = bulk(self.es, data, index=self.index, raise_on_error=True) 
    self.logger.info(success)

3、运行

if __name__ == '__main__':
  kp = KafkaPython()
  kp.getConnect()
  kp.beginConsumer()
  # kp.disConnect()

注:简单的写了一个从kafka中读取数据到一个list里,当数据达到一个阈值时,在批量插入到 es的插件

现在还在批量的压测中。。。

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

Python 相关文章推荐
用Python生成器实现微线程编程的教程
Apr 13 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
Django 视图层(view)的使用
Nov 09 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
python已协程方式处理任务实现过程
Dec 27 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
如何在Python 游戏中模拟引力
Mar 27 Python
详解Python yaml模块
Sep 23 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 #Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 #Python
python 读取Linux服务器上的文件方法
Dec 27 #Python
Python 脚本获取ES 存储容量的实例
Dec 27 #Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 #Python
python获取本机所有IP地址的方法
Dec 26 #Python
python检测IP地址变化并触发事件
Dec 26 #Python
You might like
PHP 读取Postgresql中的数组
2013/04/14 PHP
php object转数组示例
2014/01/15 PHP
JS基础之undefined与null的区别分析
2011/08/08 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
神经网络python源码分享
2017/12/15 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
Python range与enumerate函数区别解析
2020/02/28 Python
django正续或者倒序查库实例
2020/05/19 Python
python如何随机生成高强度密码
2020/08/19 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
意大利男装网店:Vrients
2019/05/02 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
移动通信行业实习自我鉴定
2013/09/28 职场文书
法人代表委托书
2014/04/04 职场文书
爱国口号
2014/06/19 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python