2017-06-08 5 views
0

Kürzlich bekam ich ein wirklich seltsames Problem. Der Sturmhaufen hat 3 Maschinen. Die Topologiestruktur ist wie folgt: Kafka Spout A -> Bolt B -> Bolt C. Ich habe alle Tupel in jedem Bolt acknowledged, obwohl es möglicherweise Ausnahmen gibt innerer Bolt (in Bolt Execute-Methode versuche ich alle Ausnahmen zu fangen und schließlich ack das Tupel). Aber hier passiert das seltsame Ding. Ich drucke das Protokoll der Ausgusstülle, auf einer Maschine alle Tupel, die durch die Ausgusstülle angekreuzt sind, aber auf anderen 2 Maschinen sind fast alle Tupel gescheitert. Und nach 60 Sekunden wurde das Tupel noch einmal und wieder und wieder abgespielt. "Fast" bedeutet zur Anfangszeit, dass alle Tupel auf den anderen 2 Maschinen fehlgeschlagen sind. Nach einiger Zeit gibt es eine kleine Anzahl von Tupeln auf den 2 Maschinen.Storm Nachricht fehlgeschlagen

Absolut sind die Tupel aufgrund von Timeout fehlgeschlagen. Aber ich weiß wirklich nicht, warum sie die Zeit überschritten haben. Laut den Logs, die ich ausgedruckt habe, bin ich mir sicher, dass alle Tupel am Ende der Execute-Methode in jeder Schraube aktiviert sind. Ich möchte also wissen, warum einige der Tupel auf den 2 Maschinen fehlgeschlagen sind.

Gibt es etwas, was ich tun kann, um herauszufinden, was mit der Topologie oder dem Sturmcluster nicht stimmt? Wirklich danke und hoffe auf deine Antwort.

Antwort

0

Ihr Problem bezieht sich auf die Handhabung von Gegendruck durch KafkaSpout in der StormTopology.

Sie können durch Einstellen der maxSpoutPending Wert in der Topologie-Konfiguration,

Config config = new Config(); 
config.setMaxSpoutPending(200); 
config.setMessageTimeoutSecs(100); 

StormSubmitter.submitTopology("testtopology", config, builder.createTopology()); 

maxSpoutPending ist die Anzahl der Tupel, die sein kann anhängige Bestätigung in Ihrer Topologie zu einem bestimmten Zeitpunkt den Gegendruck des KafkaSpout behandeln. Durch das Setzen dieser Eigenschaft wird der KafkaSpout angewiesen, keine Daten mehr von Kafka zu konsumieren, es sei denn, die Anzahl der unbestätigten Tupel ist kleiner als der Wert von maxSpoutPending.

Stellen Sie außerdem sicher, dass Sie Ihre Bolzen so fein einstellen können, dass sie so leicht wie möglich sind, sodass die Tupel vor dem Timeout bestätigt werden.