it-swarm.com.de

Wann löst der Apache Kafka Client eine "Batch Expired" -Ausnahme aus?

Mit dem Apache Kafka Java= client (0.9)) versuche ich, mit dem Kafka Producer) eine lange Reihe von Datensätzen an den Broker zu senden Klasse .

Die asynchrone Sendemethode kehrt sofort für eine Weile zurück und beginnt dann, jeden Anruf für einen kurzen Zeitraum zu blockieren. Nach ungefähr 30 Sekunden beginnt der Client mit dem Auslösen von Ausnahmen ( TimeoutException ) mit der Meldung "Stapel abgelaufen" .

Aus welchen Gründen wird diese Ausnahme ausgelöst?

36
James Thomas

Diese Ausnahme zeigt an, dass Sie Datensätze schneller in die Warteschlange stellen, als sie gesendet werden können.

Wenn Sie die send -Methode aufrufen, wird die ProducerRecord in einem internen Puffer zum Senden an den Broker gespeichert. Die Methode gibt sofort zurück, wenn ProducerRecord gepuffert wurde, unabhängig davon, ob sie gesendet wurde.

Datensätze werden zu Batches gruppiert, um sie an den Broker zu senden, um die pro Nachricht abgehörten Transporte zu reduzieren und den Durchsatz zu erhöhen.

Sobald einem Datensatz ein Stapel hinzugefügt wurde, gibt es ein Zeitlimit für das Senden dieses Stapels, um sicherzustellen, dass er innerhalb einer bestimmten Dauer gesendet wurde. Dies wird durch den Producer-Konfigurationsparameter request.timeout.ms gesteuert, der standardmäßig 30 Sekunden beträgt.

Wenn der Stapel länger als das Zeitlimit in die Warteschlange gestellt wurde, wird die Ausnahme ausgelöst. Datensätze in diesem Stapel werden aus der Sendewarteschlange entfernt.

Wenn Sie das Zeitlimit mithilfe des Konfigurationsparameters erhöhen, kann der Client die Stapel vor dem Ablauf länger in die Warteschlange stellen.

47
James Thomas

Ich habe diese Ausnahme in einem ganz anderen Kontext bekommen.

Ich habe einen Mini-Cluster aus einem Zookeeper-VM, einem Broker-VM und einem Producer/Consumer-VM eingerichtet. Ich habe alle erforderlichen Ports auf dem Server (9092) und auf dem Zookeeper (2181) geöffnet und dann versucht, eine Nachricht vom Consumer/Publisher-VM an den Broker zu veröffentlichen. Ich habe die vom OP erwähnte Ausnahme erhalten, aber da ich bisher nur eine einzige Nachricht veröffentlicht hatte (oder zumindest versuchte), konnte die Lösung nicht darin bestehen, das Timeout oder die Stapelgröße zu erhöhen. Also suchte ich nach dieser Mailingliste und fand sie, die ein ähnliches Problem beschreibt, das ich hatte, als ich versuchte, Nachrichten aus der Consumer/Producer-VM (ClosedChannelException) zu konsumieren: http://grokbase.com/t/kafka/users/152jsjekrm)/having-trouble-with-the-simplest-remote-kafka-config Der letzte Beitrag in dieser Mailingliste beschreibt tatsächlich, wie das Problem gelöst werden kann.

Um es kurz zu machen: Wenn Sie sowohl mit der Ausnahme ChannelClosedException als auch mit der Ausnahme Batch Expired Konfrontiert sind, müssen Sie diese Zeile in der Datei server.config Wahrscheinlich wie folgt ändern und den Broker neu starten:

advertised.Host.name=<broker public IP address>

Wenn es nicht gesetzt ist, wird auf die Eigenschaft Host.name (Die wahrscheinlich auch nicht gesetzt ist) und dann auf den kanonischen Hostnamen von InetAddress Java class, was letztendlich natürlich nicht stimmt und somit entfernte Knoten verwirrt.

31
Roberto

Der Parameter, der die Zeit vor dem Senden an den Broker steuert, ist linger.ms. Der Standardwert ist 0 (keine Verzögerung).

3
S. Sar

Ich verwende Kafka Java Client-Version 0.11.0.0. Ich habe auch festgestellt, dass das gleiche Muster keine konsistenten großen Nachrichten erzeugt die Nachrichten und einige andere schlagen fehl. (Obwohl sowohl bestandene als auch fehlgeschlagene Nachrichten dieselbe Größe hatten). In meinem Fall betrug jede Nachrichtengröße etwa 60 KB, was weit mehr ist als Kafkas Standard batch.size von 16 KB. Auch mein linger.ms wurde auf den Standardwert 0 gesetzt. Dieser Fehler wird ausgelöst, wenn der Producer-Client ein Zeitlimit überschreitet, bevor eine erfolgreiche Antwort vom Server empfangen werden kann. kafkaProd.send(pr).get(). Um dies zu beheben, musste ich die Standardeinstellung des Producer-Clients request.timeout.ms auf 60000 erhöhen

2
Binita Bharati

Hatte ein ähnliches Problem mit Kafka in einer Docker-Compose ausgeführt. Meine Docker-Compose.yml wurde mit festgelegt

 KAFKA_ADVERTISED_Host_NAME: kafka
 ports:
        - 9092:9092

Aber als ich versuchte, eine Nachricht mit Kamel von außerhalb Docker zu senden

to("kafka:test?brokers=localhost:9092")

Ich habe eine TimeoutException. Ich habe es durch Hinzufügen gelöst

127.0.0.1 kafka

in die Windows\System32\drivers\etc\hosts-Datei und ändere dann meine Kamel-URL in

to("kafka:test?brokers=kafka:9092")
1
Rory G