1.python-kafka:

api送上:https://kafka-python.readthedocs.io/en/latest/apidoc/KafkaConsumer.html

2.实现一个broker、topic可配置的生产者与消费者:

#coding=utf-8

import time
import logging
import sys
import json
import etc.config as conf
sys.path.append('***********/kafka-python-1.3.3')
from kafka import KafkaProducer
from kafka import KafkaConsumer
from kafka.errors import KafkaError
from kafka import TopicPartition def log_name():
base_name = conf.kafka_logDir
date = time.strftime('%Y%m%d',time.localtime(time.time())) + '.log'
return base_name + date logging.basicConfig(level=logging.DEBUG,
format='%(asctime)-15s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=log_name(),
filemode='a'
)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logging.getLogger('').addHandler(console) class kfkProducer(object): # producer = None def __init__(self, broker, kafkaPort, kafkaTopic=''):
self._broker = broker
self._kafkaPort = kafkaPort
self._kafkaTopic = kafkaTopic def __str__(self):
logging.info("--------------------------------")
logging.info("kafka-producer params ...")
logging.info("[KAFKA-BROKER]:%s" %self._broker)
logging.info("[KAFKA-PORT]:%s" %self._kafkaPort)
logging.info("[KAFKA-TOPIC]:%s" %self._kafkaTopic)
logging.info("--------------------------------") def registerKfkProducer(self):
try:
producer = KafkaProducer(bootstrap_servers = '{kafka_host}:{kafka_port}'.format(
kafka_host=self._broker,
kafka_port=self._kafkaPort
))
except KafkaError as e:
logging.info(e)
return producer def produceMsg(self, topic, msg, partition=0):
# 自动将输入字符串转化为json格式,产出消息
if(topic in ('', None)):
logging.error("topic is None, plz check!")
else:
try:
# parmas_message = json.dumps(msg)#转化为json格式
producer = self.registerKfkProducer()
producer.send(topic, value=msg, partition=partition)
producer.flush()
# time.sleep(1)
except KafkaError as e:
logging.info(e) class kfkConsumer(object): # consumer = None def __init__(self, broker, kafkaPort, kafkaTopic=''):
self._broker = broker
self._kafkaPort = kafkaPort
self._kafkaTopic = kafkaTopic def __str__(self):
logging.info("--------------------------------")
logging.info("kafka-consumer params ...")
logging.info("[KAFKA-BROKER]:%s" %self._broker)
logging.info("[KAFKA-PORT]:%s" %self._kafkaPort)
logging.info("[KAFKA-TOPIC]:%s" %self._kafkaTopic)
logging.info("--------------------------------") def registerConsumer(self):
try:
consumer = KafkaConsumer(
bootstrap_servers=[self._broker+':'+self._kafkaPort],
auto_offset_reset='earliest')
except KafkaError as e:
logging.info(e)
return consumer def consumerMsg(self, topic, partition=0):
if(topic in ('', None)):
logging.error("topic is None, plz check!")
else:
try:
v_consumer = self.registerConsumer()
v_consumer.assign([TopicPartition(topic,partition)])
# self.registerConsumer.subscribe([self._kafkaTopic])
for message in v_consumer:
# message value and key are raw bytes -- decode if necessary!
# e.g., for unicode: `message.value.decode('utf-8')
logging.info("%s:%d:%d: msg=%s" % (message.topic, message.partition,
message.offset, message.value.decode('utf-8')))
except KafkaError as e:
logging.info(e)

3.实现命令行输入topic和partition,即可生产消息:

#coding=utf-8

import os
import sys
import json
import etc.config as conf
from PykafkaMgr import kfkProducer #从json文件获取消息
def getMsgFromJsonfile(filePath):
if(not os.path.isfile(filePath)):
print(u"[%s] 输入的json文件路径有误,请检查..." %filePath)
else:
with open(filePath) as json_file:
return json.load(json_file) def except4v():
if(len(sys.argv) <= 1):
print(u"未输入topic和partition!\n你可以--help查看具体使用方法...")
elif(sys.argv[1].startswith("--")):
option = sys.argv[1][2:]
# print(option)
if(option in ("version", "Version")):
print("Version 1.0 \nPython 2.7.3 (default, Nov 6 2015, 14:11:14) \
\n[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2")
elif(option == "help"):
print(u"produceMsg.py 接收两个参数, 第一个是topic, 第二个是partition \neg:python produceMsg.py test 0 \n向topic名为test第0分区生产消息") def calcMsg(jsonMsg):
sumMsg, sumAcct = 0, 0
msgNum = len(jsonMsg)
print("------------------------------------------")
for i in range(msgNum):
acct_num = len(jsonMsg[i]["MSGBODY"])
print(u"第[%d]条消息,包含ACCT_ID账户数:[%d]个"%(i+1, acct_num))
sumMsg = i+1
sumAcct += acct_num
acct_num = 0
print(u"本次生产消息总共[%d]条, 总共账户数:[%d]个"%(sumMsg, sumAcct))
print("------------------------------------------") if __name__ == '__main__': except4v() if(len(sys.argv) == 3):
topic = sys.argv[1]
partition = int(sys.argv[2])
produce = kfkProducer(conf.kafka_mgr["broker"], conf.kafka_mgr["port"], topic)
produce.__str__()
jsonMsg = getMsgFromJsonfile(conf.kafka_produce)
for i in range(len(jsonMsg)):
produce.produceMsg(topic, ('%s'%jsonMsg[i]).encode('utf-8'), partition)
calcMsg(jsonMsg)

4.设置两个配置文件:

第一个是config.py

#coding=utf-8

#broker配置还有一种方式是:kafka_mgr={"broker":'ip1:port,ip2:port,...,ipn:port'},就是改为kafka集群,不过代码要稍微作调整(参数列表改下就行了)。当然配置两种,通过一个开关去控制也可以。自选
kafka_mgr = {
"broker" : '10.***.***.***',
"port" : 6667,
} kafka_logDir = r"/*******/log/****" #生产者输入json文件
kafka_produce = r"/**********/data/input/produceMsg.json"
生产者输入json文件:
produceMsg.json
json文件附上说明,具体可以按照说明配置

hi, welcome here~

produceMsg.json
=================================
输入json格式数据,作为生产者消息的输入。
1.支持多条json数据输入。格式如下:
[
json1,
json2,
...,
jsonN
]
总体结构是:[ , ] 2.此json文件不能加注释,因为会破坏json文件格式,导致无法解析
3.输入只要是json格式,不需要关注是不是一行或多行,多换行、空格等都不影响解析

消费者也是利用以上两个配置文件去实现即可。此处代码略

python-kafka实现produce与consumer的更多相关文章

  1. Python Kafka Client 性能测试

    一.前言 由于工作原因使用到了 Kafka,而现有的代码并不能满足性能需求,所以需要开发高效读写 Kafka 的工具,本文是一个 Python Kafka Client 的性能测试记录,通过本次测试, ...

  2. python kafka client--confluent-kafka-python

    项目中需要使用python 向Kafka生产和消费数据,最初使用pykafka .后来发现pykafka不支持client.id. 最后,终于找到confluent-kafka. python kaf ...

  3. .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(二)

    依据Partition和Consumer的Rebalance策略,找到Kafka.Client Rebalance代码块,还原本地环境,跟踪调试,发现自定义Consumer Group 的Consum ...

  4. Kafka客户端Producer与Consumer

    Kafka客户端Producer与Consumer 一.pom.xml 二.相关配置文件 producer.properties log4j.properties base.properties 三. ...

  5. ReferenceError: weakly-referenced object no longer exists Python kafka

    Python存入kafka报错,ReferenceError: weakly-referenced object no longer exists. Exception in thread 14: p ...

  6. SpringBoot整合kafka(实现producer和consumer)

    本文代码使用的是Spring Boot 2.1.8.RELEASE 版本 <parent> <groupId>org.springframework.boot</grou ...

  7. Kafka的Producer和Consumer源码学习

    先解释下两个概念: high watermark (HW) 它表示已经被commited的最后一个message offset(所谓commited, 应该是ISR中所有replica都已写入),HW ...

  8. Kafka的Producer以及Consumer远程调用问题

    公司需要分布式的JMS,所以研究了Kafka,之前在本地都没有出现问题,但是在服务器上布Kafka的时候发现了消费者无法消费的问题. kafka布到一台服务器上面,由于业务原因,producer和ka ...

  9. 设计Kafka的High Level Consumer

    原文:https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example 为什么使用High Level Consumer ...

随机推荐

  1. ajax上传图片chrome报错net::ERR_CONNECTION_RESET/net::ERR_CONNECTION_ABORTED

    网上搜了一下,base64图片太大,tomcat对post请求大小有默认限制,要在tomcat配置文件server.xml 加一个:maxPostSize="0",0表示无限制 & ...

  2. vim插件安装总结

    vim插件安装总结 vim 插件 vundle 插件对于vim来说是一个杀手级别的神器助手,能自动补全,语法高亮,文件搜索等等,有效地提升了编程效率.下面就个人的一些安装和使用进行一个总结. 自动管理 ...

  3. python——Django项目模板

    views.py # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts impor ...

  4. 两种实现方式mycat多租户,枚举分片,注解拦截

    第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式  /*!mycat:schema=[schemaName] */   注意:这在navicat 里面是会报错的,请用命令行登陆myc ...

  5. SpringBoot SpringSecurity4整合,灵活权限配置,弃用注解方式.

    SpringSecurity 可以使用注解对方法进行细颗粒权限控制,但是很不灵活,必须在编码期间,就已经写死权限 其实关于SpringSecurity,大部分类都不需要重写,需要的只是妥善的配置. 每 ...

  6. linux主机名为bogon的原因及修改方法

    今天登录linux,发现主机名是bogon,虽然不影响使用,但是看着很不爽,于是想了解一下,为什么会发生这种情况,在csdn上找了到了一个文章,原文如下: 起因:公司网络接口做了接口认证,虚拟机桥接至 ...

  7. Jpa中设置OneToMany插入报异常解决办法

    在Jpa中如果设置@OneToMany,但使用的时候,如果没有赋值,会报异常出现,这时只需要实例化一个空数组即可, 但类型一定要对应: 实例如下: newField.setxxxxxList(new ...

  8. 快速排序(QuickSort)

    1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原 ...

  9. 经典案例之MouseJack

    引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问 ...

  10. 动手制作属于你自己的WIN PE3.0

    最近想要更新公司的网Ghost系统,所以小研究一下win pe ,在网上看见一个很不错的教程,在这里分享给大家! 并非原创,纯属转载!!O(∩_∩)O~天缘的作品,很是佩服这个哥们啊..... 一.W ...