web-dev-qa-db-ja.com

Kafka(15MB以上)で大きなメッセージを送信するにはどうすればよいですか?

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)
90
Sonson123

次の3つの(または4つの)プロパティを調整する必要があります。

  • コンシューマ側:fetch.message.max.bytes-これは、コンシューマが取得できるメッセージの最大サイズを決定します。
  • ブローカー側:replica.fetch.max.bytes-これにより、ブローカーのレプリカがクラスター内でメッセージを送信し、メッセージが正しく複製されることを確認できます。これが小さすぎる場合、メッセージは複製されないため、メッセージはコミットされない(完全に複製されない)ため、コンシューマーにはメッセージが表示されません。
  • ブローカー側:message.max.bytes-これは、プロデューサーからブローカーが受信できるメッセージの最大サイズです。
  • ブローカー側(トピックごと):max.message.bytes-これは、ブローカーがトピックに追加できるメッセージの最大サイズです。このサイズは、圧縮前に検証されます。 (デフォルトはブローカーのmessage.max.bytesです。)

番号2については難しい方法を見つけました-Kafkaから例外、メッセージ、警告が表示されないので、大きなメッセージを送信するときはこのことを考慮してください。

150
laughing_man

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の詳細については、コメントを読んでください

43
Sascha Vetter

次のプロパティをオーバーライドする必要があります。

ブローカー構成($ KAFKA_HOME/config/server.properties)

  • replica.fetch.max.bytes
  • message.max.bytes

コンシューマー構成($ KAFKA_HOME/config/consumer.properties)
このステップはうまくいきませんでした。コンシューマーアプリに追加し、正常に機能しました

  • fetch.message.max.bytes

サーバーを再起動します。

詳細については、このドキュメントを参照してください: http://kafka.Apache.org/08/configuration.html

11
user2550587

KafkaプロデューサーからKafkaブローカーに送信され、Kafkaコンシューマーによって受信されるメッセージのサイズを等しくすることです。

Kafkaプロデューサー-> Kafkaブローカー-> Kafkaコンシューマー

要件が15MBのメッセージを送信する場合、ProducerBrokerおよび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
9
Ravi

message.max.bytes属性は、消費者のfetch.message.max.bytesプロパティと同期でなければならないことに注意してください。フェッチサイズは少なくとも最大メッセージサイズと同じでなければなりません。そうしないと、プロデューサーがコンシューマが消費/フェッチできるよりも大きいメッセージを送信できる場合があります。それを見てみる価値があるかもしれません。
使用しているKafkaのバージョンはどれですか?また、取得している詳細トレースも提供します。 ... payload size of xxxx larger than 1000000のようなものがログに表示されますか?

7
user2720864

@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

5
Bhanu Hoysala