无法向Kafka发送大型邮件

时间:2018-08-09 13:05:51

标签: python-2.7 apache-kafka max kafka-producer-api kafka-python

我想从制作人那里向Kafka发送一条大消息,所以我更改了以下属性。

经纪人(server.properties)

replica.fetch.max.bytes=317344026
message.max.bytes=317344026
max.message.bytes=317344026
max.request.size=317344026

生产者(producer.properties)

max.request.size=3173440261

消费者(consumer.properties)

max.partition.fetch.bytes=327344026
fetch.message.max.bytes=317344026

当我使用python Popen和kafta的cli命令运行生产者时,仍然出现如下所示的错误。

代码:

def producer(topic_name, content):
    p = subprocess.Popen(['/opt/kafka/kafka_2.11-0.9.0.0/bin/kafka-console-producer.sh', '--broker-list', 'localhost:9092', '--topic', 'Hello-Kafka'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
    p.stdin.write(content)
    out, err = p.communicate()
    print out

错误:

ERROR Error when sending message to topic Hello-Kafka with key: null, value: 1677562 bytes with error: The message is 1677588 bytes when serialized which is larger than the maximum request size you have configured with the max.request.size configuration. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

当我将python模块用于kafka(https://github.com/dpkp/kafka-python)时出现错误提示

代码:

def producer(topic_name, content):
    p = KafkaProducer(bootstrap_servers='localhost:9092')
    a = p.send(topic_name, content).get()
    print a    
    p.flush()
    p.close()

错误:

kafka.errors.MessageSizeTooLargeError: [Error 10] MessageSizeTooLargeError: The message is 217344026 bytes when serialized which is larger than the maximum request size you have configured with the max_request_size configuration

我成功尝试过的一件事是将内容分成多个块,但是如果有人有解决方案,而又不分割内容。

2 个答案:

答案 0 :(得分:1)

kafka-console-producer.sh

调用kafka-console-producer.sh时没有使用producer.properties文件。
使用--producer.config标志。

KafkaProducer

您的KafkaProducer使用默认值。调用时必须设置max_request_size
参见KafkaProducer doc

KafkaProducer(bootstrap_servers='localhost:9092', max_request_size=3173440261)

答案 1 :(得分:0)

您的字符串大小确实很大,在基于队列的系统中使用并不是真正的信息,请重新考虑平台的体系结构。话虽如此,您可以尝试压缩配置,看看它们是否有帮助。

Kafka数据压缩:在Kafka上有两种数据压缩方式,即生产方和代理方。两者都有优点和缺点,我发现(并且我认为其他人也建议)生产者端压缩更好,因为它可以提供更好的批优化。

"compression.codec"="2"
"compressed.topics"="<your-topic-name>"

(0:不压缩,1:GZIP压缩,2:Snappy压缩,3:LZ4压缩)

进一步阅读:  Compression ideas