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中用startswith()函数判断字符串开头的教程
Apr 07 Python
Python使用chardet判断字符编码
May 09 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
Django添加sitemap的方法示例
Aug 06 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
python redis连接 有序集合去重的代码
Aug 04 Python
python简单实现最大似然估计&scipy库的使用详解
Apr 15 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
浅析NumPy 切片和索引
Sep 02 Python
Python软件包安装的三种常见方法
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获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
深入分析PHP设计模式
2020/06/15 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
详解KMP算法以及python如何实现
2020/09/18 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
高中自我鉴定
2013/12/20 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
公司授权委托书范文
2014/08/02 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python