2012-09-26 21 views
7

Ich spiele mit Storm herum und frage mich, wo Storm (wenn möglich) die (taumelnde/gleitende) Fenstergröße bei einer Aggregation angibt. Z.B. Wenn wir die Trendthemen für die letzte Stunde auf Twitter finden wollen. Wie legen wir fest, dass eine Schraube für jede Stunde Ergebnisse liefern soll? Wird dies programmatisch in jeder Schraube gemacht? Oder ist es eine Möglichkeit, ein "Fenster" anzugeben?(Twitter) Storm's Window On Aggregation

Antwort

17

Haftungsausschluss: Ich schrieb die Trending Topics mit Storm Artikel von gakhov in his answer above verwiesen.

Ich würde sagen, die beste Praxis ist die Verwendung der sogenannten tick tuples in Storm 0.8+. Mit diesen können Sie eigene Ausläufe konfigurieren, die in bestimmten Zeitintervallen (z. B. alle zehn Sekunden oder jede Minute) benachrichtigt werden.

Hier ist ein einfaches Beispiel, das die fragliche Komponente konfiguriert alle zehn Sekunden Zecke Tupel zu erhalten: execute() Methode des

// in your spout/bolt 
@Override 
public Map<String, Object> getComponentConfiguration() { 
    Config conf = new Config(); 
    int tickFrequencyInSeconds = 10; 
    conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, tickFrequencyInSeconds); 
    return conf; 
} 

Sie können dann einen bedingten Schalter verwenden in Ihrem Auslauf/Bolzen „normal“ incoming Tupeln zu unterscheiden aus den speziellen Tick Tupeln. Zum Beispiel:

// in your spout/bolt 
@Override 
public void execute(Tuple tuple) { 
    if (isTickTuple(tuple)) { 
     // now you can trigger e.g. a periodic activity 
    } 
    else { 
     // do something with the normal tuple 
    } 
} 

private static boolean isTickTuple(Tuple tuple) { 
    return tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID) 
     && tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID); 
} 

Wieder schrieb ich eine ziemlich detailed blog post über das tun dies in Sturm vor ein paar Tagen als gakhov hingewiesen (schamlose Werbung!).

+0

Wir verwendeten Tick-Tupel zum "Auslösen" einer Aggregationsfunktion (Schraube). Danke ein Haufen =) – gronnbeck

+0

Gern geschehen. :) –

+0

Hallo Michael, ich frage mich: Während der Sturm läuft, kann ich irgendwie die Frequenz der Tick-Tupel ändern? Wenn wir können, können wir die Häufigkeit ändern, mit der storm das Protokoll der Trendergebnisse schreibt, oder es kann die Fenstergröße ändern, bei der der Sturm den Topic-Trend berechnet. Vielen Dank! – user2895478

1

Fügen Sie einen neuen Auslauf mit dem Parallelitätsgrad 1 hinzu und lassen Sie ein leeres Signal und dann Utils.sleep bis zum nächsten Mal ausgeben (alles in nextTuple). Verknüpfen Sie anschließend alle relevanten Schrauben mit der gesamten Gruppierung, sodass alle ihre Instanzen dasselbe Signal erhalten.