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 collections模块实例讲解
Apr 07 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
python通过移动端访问查看电脑界面
Jan 06 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
零基础小白多久能学会python
Jun 22 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
Python eval函数介绍及用法
Nov 09 Python
Python __slots__的使用方法
Nov 15 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 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
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
ES6 Set结构的应用实例分析
2019/06/26 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
python 判断自定义对象类型
2009/03/21 Python
python生成器generator用法实例分析
2015/06/04 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
手术室护士自我鉴定
2013/10/14 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
高中生物教学反思
2014/02/05 职场文书
小学端午节活动方案
2014/03/13 职场文书
施工员岗位职责
2014/03/16 职场文书
企业节能减排实施方案
2014/03/19 职场文书
活动总结书
2014/05/08 职场文书
银行实习推荐信
2015/03/27 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
速龙x4-860k处理器相当于i几
2022/04/20 数码科技