2016-05-05 12 views
1

Ich habe eine Storm-Topologie, die viele Spouts und Bolts erzeugt. Sie werden offensichtlich auf verschiedenen Systemen/Knoten verteilt sein, die ihre eigenen JVMs haben.Wie können Variablen gespeichert werden, auf die alle Spouts und Bolts in Apache Storm zugreifen können?

Ich verstehe, dass Storm automatisch die Netzwerkkommunikation verwaltet, so dass die Tupel, die von der Tülle ausgegeben werden, die Schrauben auf einer anderen JVM erreichen.

Was ich nicht verstehe, ist, wie ich einige Variablen beibehalten kann, die den Überblick behalten können.
Ich möchte eine Variable, die die Anzahl der Tupel zählt, die von allen Instanzen von Bolt-A verarbeitet wurden. Eine weitere Variable zum Zählen für Bolt-B und so weiter.

Ich brauche auch eine Variable, die als Flag fungiert, so dass ich weiß, wenn die Spouts keine Daten mehr zu emittieren haben, damit die Bolts anfangen können, in SQL zu schreiben.

Ich überlegte, Redis zu verwenden, aber wollte wissen, ob das der beste Weg ist oder gibt es einen anderen Weg? Irgendwelche Codebeispiele überall verfügbar? Ich habe Google-gesucht, konnte aber nicht viele nützliche Informationen finden.

Antwort

1

Erstens, es gibt keine Möglichkeit, die Variable zwischen den Aufgaben auf Storm zu teilen.

Anstatt die Flagge direkt zu teilen, können Sie Ihre eigene "Steuerungs" -Nachricht definieren und an Schrauben senden, um zu wissen, dass keine Nachricht für die Ausgabe von Spout vorhanden ist.

Freigabe von Status mit Redis ist eine der möglichen Optionen (Sie müssen Ihre eigene Logik implementieren), aber Flag-Wert könnte flackern, so dass Sie sich darum kümmern sollten.

0

Sie sollten in der Lage sein, die Anzahl der Tupel zu erhalten, die pro Komponente und pro Instanz jeder Komponente aus der Storm UI ausgegeben und übertragen werden. Es gibt sogar eine REST API, um die Werte abzurufen.

+0

Ok, aber in diesem Fall gibt es keine Möglichkeit für mich zu wissen, wie viele Tupel genug sind. Wie in der Frage erwähnt, brauche ich eine Flag-Variable, die die Schrauben prüfen können. – Nav

0

Für die Faust Anforderung können Sie Metrics API (http://storm.apache.org/releases/0.10.1/Metrics.html)

Für die zweite Anforderung verwenden können, warum nicht einen „Flush“ Tupel ähnlich den Timer Tupel schicken?

+0

Danke. Es stellt sich heraus, dass es für die zweite Anforderung eine andere Möglichkeit gibt, die Topologiestruktur zu erstellen: http://nrecursions.blogspot.in/2016/05/more-concepts-of-apache-storm-you-need.html#morecreativetopologystructures – Nav

+0

Sieht gut aus. Dies verkompliziert jedoch die Topologie, was bedeutet, dass alle Schrauben basierend auf dem Stream-Namen an eine separate Stream- und Verzweigungslogik anfügen müssen. Ich denke, der Ansatz ähnelt dem Zeittupel. Ein Punkt hinzufügen, wenn Sie sagen ** nothingMoreToProcess ** sollten Sie sich ansehen ** allAcked ** – YaRiK