[英]Dump the kafka (kafka-python) to a txt file
我需要定期将kafka使用者的输出转储到excel文件中。 我使用以下代码:
from kafka import KafkaConsumer
from kafka import KafkaProducer
import json,time
from xlutils.copy import copy
from xlrd import open_workbook
import pandas
consumer = KafkaConsumer(bootstrap_servers='localhost:9092')
KafkaConsumer()
consumer.subscribe("test")
rowx=0
colx=0
for msg in consumer:
book_ro = open_workbook("twitter.xls")
book = copy(book_ro) # creates a writeable copy
sheet1 = book.get_sheet(0) # get a first sheet
sheet1.write(rowx,colx, msg[6])
book.save("twitter.xls")
现在,我的问题是代码效率不高。 对于每个消息,我需要打开,编写然后保存excel文件。 有什么方法可以一次打开excel,编写然后关闭它(对于一批消息,而不是在for循环中)? n
是的,打开,写入,保存和关闭每个消息效率很低,您可以分批完成。 但是仍然需要在消费循环中做到这一点。
msg_buffer = []
buffer_size = 100
for msg in consumer:
msg_buffer.append(msg[6])
if len(msg_buffer) >= buffer_size:
book_ro = open_workbook("twitter.xls")
book = copy(book_ro) # creates a writeable copy
for _msg in msg_buffer:
sheet1 = book.get_sheet(0) # get a first sheet
sheet1.write(rowx,colx, _msg)
book.save("twitter.xls")
msg_buffer = []
您可能认为这将比nobatch快100倍。
更新以发表评论:
是的,通常我们将永远停留在此循环中,它在内部使用轮询来获取新消息,发送心跳并提交偏移量。 并且,如果您的目标是使用此主题中的消息并保存消息,则这应该是一个长期运行的循环。
这是kafka-python设计,您应该像这样使用消息来使用消息或使用Consumer.poll()。
至于为什么可以for msg in consumer:
使用for msg in consumer:
原因,因为使用者是一个迭代器对象,所以它的类实现__iter__
和__next__
,它的底层使用提取程序来提取记录。 您可以参考https://github.com/dpkp/kafka-python/blob/master/kafka/consumer/group.py的更多实现细节
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.