Kafka Producer APIを使用して、文字列メッセージをJava V. 0.8に送信します。メッセージサイズが約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)
次の3つの(または4つの)プロパティを調整する必要があります。
fetch.message.max.bytes
-これは、コンシューマが取得できるメッセージの最大サイズを決定します。replica.fetch.max.bytes
-これにより、ブローカーのレプリカがクラスター内でメッセージを送信し、メッセージが正しく複製されることを確認できます。これが小さすぎる場合、メッセージは複製されないため、メッセージはコミットされない(完全に複製されない)ため、コンシューマーにはメッセージが表示されません。message.max.bytes
-これは、プロデューサーからブローカーが受信できるメッセージの最大サイズです。max.message.bytes
-これは、ブローカーがトピックに追加できるメッセージの最大サイズです。このサイズは、圧縮前に検証されます。 (デフォルトはブローカーのmessage.max.bytes
です。)番号2については難しい方法を見つけました-Kafkaから例外、メッセージ、警告が表示されないので、大きなメッセージを送信するときはこのことを考慮してください。
Kafka 0.10および 新しい消費者 と比較してマイナーな変更が必要 laughing_man's answer :
message.max.bytes
およびreplica.fetch.max.bytes
を増やす必要があります。 message.max.bytes
は、replica.fetch.max.bytes
と等しいか、それより小さくする必要があります(*)。max.request.size
を増やして、より大きなメッセージを送信します。max.partition.fetch.bytes
を増やして、より大きなメッセージを受信します。(*)message.max.bytes
<= replica.fetch.max.bytes
の詳細については、コメントを読んでください
次のプロパティをオーバーライドする必要があります。
ブローカー構成($ KAFKA_HOME/config/server.properties)
コンシューマー構成($ KAFKA_HOME/config/consumer.properties)
このステップはうまくいきませんでした。コンシューマーアプリに追加し、正常に機能しました
サーバーを再起動します。
詳細については、このドキュメントを参照してください: http://kafka.Apache.org/08/configuration.html
KafkaプロデューサーからKafkaブローカーに送信され、Kafkaコンシューマーによって受信されるメッセージのサイズを等しくすることです。
Kafkaプロデューサー-> Kafkaブローカー-> Kafkaコンシューマー
要件が15MBのメッセージを送信する場合、Producer、BrokerおよびConsumer(3つすべて)は同期する必要があります。
Kafka Producer 15 MBを送信->Kafka Broker 15 MBを許可/保存->Kafka Consumer 15 MBを受信
したがって、設定は次のようになります。
a)ブローカー:
message.max.bytes=15728640
replica.fetch.max.bytes=15728640
b)消費者について:
fetch.message.max.bytes=15728640
message.max.bytes
属性は、消費者のfetch.message.max.bytes
プロパティと同期でなければならないことに注意してください。フェッチサイズは少なくとも最大メッセージサイズと同じでなければなりません。そうしないと、プロデューサーがコンシューマが消費/フェッチできるよりも大きいメッセージを送信できる場合があります。それを見てみる価値があるかもしれません。
使用しているKafkaのバージョンはどれですか?また、取得している詳細トレースも提供します。 ... payload size of xxxx larger than 1000000
のようなものがログに表示されますか?
@laughing_manからの答えは非常に正確です。しかし、それでも、QuoraのKafkaエキスパートStephane Maarekから学んだ推奨事項を伝えたかったのです。
Kafkaは大きなメッセージを処理するためのものではありません。
APIはクラウドストレージ(Ex AWS S3)を使用し、Kafkaまたは任意のメッセージブローカーにS3の参照をプッシュするだけです。データを永続化する場所を見つける必要があります。ネットワークドライブである場合もあれば、何であれ、メッセージブローカーであってはなりません。
上記のソリューションを使用したくない場合は、
メッセージの最大サイズは1MBです(ブローカーの設定はmessage.max.bytes
と呼ばれます) Apache Kafka 。本当にひどく必要な場合は、そのサイズを増やして、プロデューサーとコンシューマーのネットワークバッファーを増やしてください。
そして、メッセージを本当に分割したい場合は、各パーティションに正確に同じキーを割り当てて、同じパーティションにプッシュされるようにし、メッセージの内容が「part id」を報告して消費者がメッセージを完全に再構築できるようにしてください。
メッセージがテキストベース(gzip、snappy、lz4圧縮)である場合は、データサイズを削減できますが、魔法ではない圧縮も検討できます。
繰り返しますが、外部システムを使用してそのデータを保存し、外部参照をKafkaにプッシュする必要があります。これは非常に一般的なアーキテクチャであり、広く受け入れられているものです。
Kafkaは、メッセージのサイズが大きくないが量が多い場合にのみ最適に機能することを念頭に置いてください。
ソース: https://www.quora.com/How-do-I-send-Large-messages-80-MB-in-Kafka