在python环境下运用kafka对数据进行实时传输的方法


Posted in Python onDecember 27, 2018

背景:

为了满足各个平台间数据的传输,以及能确保历史性和实时性。先选用kafka作为不同平台数据传输的中转站,来满足我们对跨平台数据发送与接收的需要。

kafka简介:

Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。

总之:kafka做为中转站有以下功能:

1.生产者(产生数据或者说是从外部接收数据)

2.消费着(将接收到的数据转花为自己所需用的格式)

环境:

1.python3.5.x

2.kafka1.4.3

3.pandas

准备开始:

1.kafka的安装

pip install kafka-python

在python环境下运用kafka对数据进行实时传输的方法

2.检验kafka是否安装成功

在python环境下运用kafka对数据进行实时传输的方法

3.pandas的安装

pip install pandas

4.kafka数据的传输

直接撸代码:

# -*- coding: utf-8 -*-
'''
@author: 真梦行路
@file: kafka.py
@time: 2018/9/3 10:20
'''
import sys
import json
import pandas as pd
import os
from kafka import KafkaProducer
from kafka import KafkaConsumer
from kafka.errors import KafkaError
 
KAFAKA_HOST = "xxx.xxx.x.xxx" #服务器端口地址
KAFAKA_PORT = 9092    #端口号
KAFAKA_TOPIC = "topic0"  #topic
 
data=pd.read_csv(os.getcwd()+'\\data\\1.csv')
key_value=data.to_json()
class Kafka_producer():
 '''
 生产模块:根据不同的key,区分消息
 '''
 
 def __init__(self, kafkahost, kafkaport, kafkatopic, key):
  self.kafkaHost = kafkahost
  self.kafkaPort = kafkaport
  self.kafkatopic = kafkatopic
  self.key = key
  self.producer = KafkaProducer(bootstrap_servers='{kafka_host}:{kafka_port}'.format(
   kafka_host=self.kafkaHost,
   kafka_port=self.kafkaPort)
  )
 
 def sendjsondata(self, params):
  try:
   parmas_message = params  #注意dumps
   producer = self.producer
   producer.send(self.kafkatopic, key=self.key, value=parmas_message.encode('utf-8'))
   producer.flush()
  except KafkaError as e:
   print(e)
 
 
class Kafka_consumer():
 
 
 def __init__(self, kafkahost, kafkaport, kafkatopic, groupid,key):
  self.kafkaHost = kafkahost
  self.kafkaPort = kafkaport
  self.kafkatopic = kafkatopic
  self.groupid = groupid
  self.key = key
  self.consumer = KafkaConsumer(self.kafkatopic, group_id=self.groupid,
          bootstrap_servers='{kafka_host}:{kafka_port}'.format(
           kafka_host=self.kafkaHost,
           kafka_port=self.kafkaPort)
          )
 
 def consume_data(self):
  try:
   for message in self.consumer:
    yield message
  except KeyboardInterrupt as e:
   print(e)
 
def sortedDictValues(adict):
 items = adict.items()
 items=sorted(items,reverse=False)
 return [value for key, value in items]
 
def main(xtype, group, key):
 '''
 测试consumer和producer
 '''
 if xtype == "p":
  # 生产模块
  producer = Kafka_producer(KAFAKA_HOST, KAFAKA_PORT, KAFAKA_TOPIC, key)
  print("===========> producer:", producer)
  params =key_value
  producer.sendjsondata(params)
 
 
 if xtype == 'c':
  # 消费模块
  consumer = Kafka_consumer(KAFAKA_HOST, KAFAKA_PORT, KAFAKA_TOPIC, group,key)
  print("===========> consumer:", consumer)
 
  message = consumer.consume_data()
  for msg in message:
   msg=msg.value.decode('utf-8')
   python_data=json.loads(msg) ##这是一个字典
   key_list=list(python_data)
   test_data=pd.DataFrame()
   for index in key_list:
    print(index)
    if index=='Month':
     a1=python_data[index]
     data1 = sortedDictValues(a1)
     test_data[index]=data1
    else:
     a2 = python_data[index]
     data2 = sortedDictValues(a2)
     test_data[index] = data2
     print(test_data)
 
 
 
   # print('value---------------->', python_data)
   # print('msg---------------->', msg)
   # print('key---------------->', msg.kry)
   # print('offset---------------->', msg.offset)
 
 
 
if __name__ == '__main__':
 main(xtype='p',group='py_test',key=None)
 main(xtype='c',group='py_test',key=None)

在python环境下运用kafka对数据进行实时传输的方法

数据1.csv如下所示:

在python环境下运用kafka对数据进行实时传输的方法

几点注意:

1、一定要有一个服务器的端口地址,不要用本机的ip或者乱写一个ip不然程序会报错。(我开始就是拿本机ip怼了半天,总是报错)

2、注意数据的传输格式以及编码问题(二进制传输),数据先转成json数据格式传输,然后将json格式转为需要格式。(不是json格式的注意dumps)

例中,dataframe->json->dataframe

3、例中dict转dataframe,也可以用简单方法直接转。

eg: type(data) ==>dict,data=pd.Dateframe(data)

以上这篇在python环境下运用kafka对数据进行实时传输的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python测试驱动开发实例
Oct 08 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
详解Python中的正则表达式
Jul 08 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
python画图的函数用法以及技巧
Jun 28 Python
anaconda如何查看并管理python环境
Jul 05 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
python blinker 信号库
May 04 Python
kafka-python批量发送数据的实例
Dec 27 #Python
Python闭包思想与用法浅析
Dec 27 #Python
对python操作kafka写入json数据的简单demo分享
Dec 27 #Python
python消费kafka数据批量插入到es的方法
Dec 27 #Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 #Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 #Python
python 读取Linux服务器上的文件方法
Dec 27 #Python
You might like
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
一个简单php扩展介绍与开发教程
2010/08/19 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
javascript一点特殊用法
2008/05/28 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
jQuery功能函数详解
2015/02/01 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
python之yield表达式学习
2014/09/02 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
python3字符串操作总结
2019/07/24 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
Django更新models数据库结构步骤
2020/04/01 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Python json格式化打印实现过程解析
2020/07/21 Python
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
Java程序员常见面试题
2015/07/16 面试题
酒店管理专业学生求职信
2013/09/27 职场文书
出纳的岗位职责
2013/11/09 职场文书
小学校本培训方案
2014/06/06 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
2015年植树节活动总结
2015/02/06 职场文书
红楼梦读书笔记
2015/06/25 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
Jsonp劫持学习
2021/04/01 PHP
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android