2016-03-30 3 views
2

Schauen Sie sich das example:Warum wird nur eine Instanz von GlobalWindow verwendet?

// We create sessions for each id with max timeout of 3 time units 
DataStream<Tuple3<String, Long, Integer>> aggregated = source 
     .keyBy(0) 
     .window(GlobalWindows.create()) 
     .trigger(new SessionTrigger(3L)) 
     .sum(2); 

Kann mir jemand erklären, warum in diesem Beispiel eine Instanz GlobalWindow (innen GlobalWindows#assignWindows erstellt) verwenden?

Scheint, wie für alle eingehenden Ereignis-IDs sollten eigene Fenster dh Window(a) für a Ereignis, Window(b) für b Ereignis erstellt werden, usw., weil, wie ich Flink verstehen Instanzen Fenster für Mitarbeiter mit Ereignissen entsprachen, dh alle a Ereignissen zugeordnet werden soll mit Window(a) zum Beispiel. In diesem Fall werden nur alle a Ereignisse, die mit Window(a) verknüpft sind, an die Fensterfunktion übergeben und zusammen verarbeitet (in diesem Beispiel wird die Anzahl der Ereignisse nach ID gruppiert, dh nach a, b usw.), aber wie Sie dieses Beispiel sehen können eine Instanz von GlobalWindow.

Antwort

2

Es ist korrekt, dass Flink die Instanzen Window verwendet, um Elemente zu gruppieren, die zu demselben Fenster gehören. Der Eingangsstrom wird jedoch bereits vorher nach dem angegebenen Schlüssel gruppiert. So speichert Flink für jeden Schlüssel eine Liste von Fenstern und ihren zugehörigen Elementen. Dies ermöglicht die Verwendung der gleichen Fensterinstanz über mehrere Schlüssel hinweg.

Um genauer zu sein, intern Sie ein verschachteltes Map<Window, Map<Key, List<Element>> haben, die für jedes Paar von Window und Key die Elementen in einem List speichert.

Der Vorteil dieses Ansatzes besteht darin, dass sich die Implementierungen der Fensterlogik für einen codierten Stream und einen nicht codierten Stream nicht unterscheiden. Für den letzteren Fall setzen Sie den Schlüssel einfach auf einen Dummy-Wert.

+0

Von der https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/windows.html heißt es "Ein globaler Windows-Assigner weist alle Elemente mit dem gleichen Schlüssel zu einzelnes globales Fenster. ", wenn also 10 verschiedene Schlüssel vorhanden sind, würde es 10 verschiedene globale Fenster generieren? –

+0

Semantisch haben Sie für jeden Schlüssel ein anderes Fenster. Implementationsgemäß ist die Fensterinstanz für alle Schlüssel gleich. Der Grund dafür ist, dass die Fensterinstanz einen zusammengesetzten Schlüssel mit dem Schlüsselwert bildet, um die Fensterelemente eindeutig zu identifizieren. –

+0

Dies ist nur für globale Windows, oder? Für das Zeitfenster hätten 10 verschiedene Schlüssel 10 verschiedene Zeitfenster-Instanzen, sogar aus der Implementierungsperspektive, richtig? Bitte korrigiere mich, wenn ich falsch liege. –