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条件和循环的使用方法
Nov 01 Python
python自动化测试之连接几组测试包实例
Sep 28 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
Python中字符串的修改及传参详解
Nov 30 Python
Python输出带颜色的字符串实例
Oct 10 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
python tornado微信开发入门代码
Aug 24 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
python 绘制场景热力图的示例
Sep 23 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
JAVA/JSP学习系列之二
2006/10/09 PHP
谈谈PHP语法(2)
2006/10/09 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
一个基于PDO的数据库操作类
2011/03/24 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
深入php处理整数函数的详解
2013/06/09 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
市场营销职业生涯规划书范文
2014/01/12 职场文书
毕业生自荐书
2014/02/02 职场文书
公司贷款承诺书
2014/05/30 职场文书
超市员工辞职信范文
2015/05/12 职场文书