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解析xml成对应的html示例分享
Apr 02 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
python持久性管理pickle模块详细介绍
Feb 18 Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
python类的继承实例详解
Mar 30 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 Python
python读取ini配置的类封装代码实例
Jan 08 Python
详解python变量与数据类型
Aug 25 Python
python中if嵌套命令实例讲解
Feb 25 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
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
php对象工厂类完整示例
2018/08/09 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python装饰器用法实例总结
2018/05/26 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
会计与出纳自荐书范文
2014/03/16 职场文书
文员求职信
2014/07/15 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
搭建Yolov5服务器
2022/04/30 Servers