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实现类似ftp传输文件的网络程序示例
Apr 08 Python
详解Python中with语句的用法
Apr 15 Python
Python 12306抢火车票脚本
Feb 07 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
浅谈Python反射 & 单例模式
Mar 21 Python
Python OS模块实例详解
Apr 15 Python
java中的控制结构(if,循环)详解
Jun 26 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
深度学习小工程练习之垃圾分类详解
Apr 14 Python
Python matplotlib绘制雷达图
Apr 13 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
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
JS之小练习代码
2008/10/12 Javascript
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中的True,False条件判断实例分析
2015/01/12 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Python工程师面试必备25条知识点
2018/01/17 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
django实现用户注册实例讲解
2019/10/30 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
为什么是 Python -m
2020/06/19 Python
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
医学生个人求职信范文
2014/02/07 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python