我发送字符串消息到Kafka V. 0.8
使用 Java Producer API。
如果消息大小约为 15 MB,我会得到MessageSizeTooLargeException
。
我尝试过设置message.max.bytes
到 40 MB,但我仍然遇到异常。小消息没有问题。
异常出现在生产者中,我在这个应用程序中没有消费者。
我怎样才能摆脱这个异常?
我的示例生产者配置
private ProducerConfig kafkaConfig() {
Properties props = new Properties();
props.put("metadata.broker.list", BROKERS);
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("request.required.acks", "1");
props.put("message.max.bytes", "" + 1024 * 1024 * 40);
return new ProducerConfig(props);
}
错误日志:
4709 [main] WARN kafka.producer.async.DefaultEventHandler - Produce request with correlation id 214 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
4869 [main] WARN kafka.producer.async.DefaultEventHandler - Produce request with correlation id 217 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
5035 [main] WARN kafka.producer.async.DefaultEventHandler - Produce request with correlation id 220 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
5198 [main] WARN kafka.producer.async.DefaultEventHandler - Produce request with correlation id 223 failed due to [datasift,0]: kafka.common.MessageSizeTooLargeException
5305 [main] ERROR kafka.producer.async.DefaultEventHandler - Failed to send requests for topics datasift with correlation ids in [213,224]
kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
at kafka.producer.async.DefaultEventHandler.handle(Unknown Source)
at kafka.producer.Producer.send(Unknown Source)
at kafka.javaapi.producer.Producer.send(Unknown Source)
您需要调整三个(或四个)属性:
- 消费端:
fetch.message.max.bytes
- 这将确定消费者可以获取的消息的最大大小。
- 经纪商方面:
replica.fetch.max.bytes
- 这将允许代理中的副本在集群内发送消息并确保消息正确复制。如果这个值太小,那么消息将永远不会被复制,因此,消费者将永远不会看到该消息,因为该消息永远不会被提交(完全复制)。
- 经纪商方面:
message.max.bytes
- 这是代理可以从生产者接收的消息的最大大小。
- 经纪人方(每个主题):
max.message.bytes
- 这是代理允许附加到主题的最大消息大小。该尺寸经过预压缩验证。 (默认为经纪商message.max.bytes
.)
我发现了关于第二点的困难方法 - 你不会从 Kafka 收到任何异常、消息或警告,所以当你发送大消息时一定要考虑这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)