Kafka制作人正在发送.gz文件,但无法在消费者端解压缩和读取文件。获取错误" IOError:不是gzip压缩文件"
制片人 - bin / kafka-console-producer.sh --broker-list localhost:9092 --topic Airport< 〜/下载/ stocks.json.gz
消费者 -
import sys
import gzip
import StringIO
from kafka import KafkaConsumer
consumer = KafkaConsumer(KAFKA_TOPIC, bootstrap_servers=KAFKA_BROKERS)
try:
for message in consumer:
f = StringIO.StringIO(message.value)
gzip_f = gzip.GzipFile(fileobj=f)
unzipped_content = gzip_f.read()
content = unzipped_content.decode('utf8')
print (content)
except KeyboardInterrupt:
sys.exit()
消费者的错误 -
Traceback (most recent call last):
File "consumer.py", line 18, in <module>
unzipped_content = gzip_f.read()
File "/usr/lib64/python2.6/gzip.py", line 212, in read
self._read(readsize)
File "/usr/lib64/python2.6/gzip.py", line 255, in _read
self._read_gzip_header()
File "/usr/lib64/python2.6/gzip.py", line 156, in _read_gzip_header
raise IOError, 'Not a gzipped file'
IOError: Not a gzipped file
答案 0 :(得分:0)
Kafka并非用于发送大量有效载荷/消息。您应该将其视为分布式消息总线,它为您提供分布式系统的所有权限。
由于以下原因,Kafka限制了可以发送的邮件的大小
解决方案:
播放批量大小:
batch.size
以总字节数而不是消息数来衡量批量大小。它控制在向Kafka代理发送消息之前要收集的数据字节数。在不超出可用内存的情况下将其设置得尽可能高。默认值为 16384 。
如果增加缓冲区的大小,它可能永远不会满。 Producer最终根据其他触发器发送信息,例如逗留时间(以毫秒为单位)。虽然您可以通过将缓冲区批处理大小设置得过高来减少内存使用量,但这不会影响延迟。
如果您的制作人一直在发送,您可能会获得最佳的吞吐量。如果生产者经常闲置,您可能没有编写足够的数据来保证当前的资源分配。
由于您的数据为gzip
,因此您可以使用Reference Based Messaging
。
而不是使用无法覆盖所有文件大小的提取大小和消息最大字节大小,而是将文件存储在分布式文件系统(如NFS / HDFS / S3)上,并将引用发送给使用者。消费者可以选择位置并解压缩数据。