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 os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
python简单实现基数排序算法
May 16 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
Python为何不能用可变对象作为默认参数的值
Jul 01 Python
python之拟合的实现
Jul 19 Python
Python实现ATM系统
Feb 17 Python
Python更换pip源方法过程解析
May 19 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
python list的index()和find()的实现
Nov 16 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 Python
Python实现日志实时监测的示例详解
Apr 06 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
ajax实现无刷新分页(php)
2010/07/18 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
js DOM的学习笔记
2011/12/22 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
2013/08/28 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
JS实现拼图游戏
2021/01/29 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
pyside写ui界面入门示例
2014/01/22 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
python使用fork实现守护进程的方法
2017/11/16 Python
kafka-python批量发送数据的实例
2018/12/27 Python
Python给图像添加噪声具体操作
2019/03/03 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python cumsum函数的具体使用
2019/07/29 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
人事经理岗位职责
2014/04/28 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP