2017-02-10 7 views
0

Angenommen, ich habe einen Stream mit Schlüsseln und Zeitstempeln. Ich möchte das kartesische Produkt dieser Schlüssel in jedem Fenster erstellen (Schiebefenster). Wenn ich die Tasten 1,2,3,4 haben, und ich habe die Parallelität auf zwei gesetzt, ich will „Gruppe“, um sie auf die folgende Weise:Flink Streaming - kartesisches Produkt und Windowing über Streams

1 - 2 2 - 3 
1 - 3 2 - 4 
1 - 4 3 - 4 

Und ich möchte die Elemente pro Gruppe verarbeiten pro Fenster. Stellen Sie sich also vor, dass die obigen Elemente (1,2,3,4) basierend auf ihren Zeitstempeln im selben Fenster liegen. In der einfachsten Form ist meine Frage: Wenn ich einige Elemente in jedem gleitenden Fenster (die mehrere Schlüssel enthalten könnten) habe, möchte ich die Kombinationen dieser Schlüssel wie im obigen Beispiel erstellen und einen benutzerdefinierten Algorithmus auf diese gruppierten Elemente anwenden .

Was ich bisher versucht, ist die Verwendung von

.assignAscendingTimestamps(...) 
.keyBy(...) 
.timeWindow(Time.seconds(5),Time.seconds(5)) 
.apply(...) 

aber dies wird nur einen Algorithmus pro Schlüssel anwenden, sowie die Kombinationen können nicht erstellt werden.

P. S .: Ich habe dieses Dokument gesehen haben: denken https://cwiki.apache.org/confluence/display/FLINK/Streams+and+Operations+on+Streams

und ich, daß die diskretisierten Ströme erwähnt es würde den Trick tun, aber sie sind in flink 1.2 (oder einer anderen Version) nicht zur Verfügung.

+0

Vielleicht bekomme ich das nicht richtig, aber ** "einige Elemente in jedem gleitenden Fenster (die möglicherweise mehrere Schlüssel enthalten)" ** kann nicht mit dem gegebenen Beispiel arbeiten, weil Sie ein 'timeWindow' an erstellen ein 'KeyedStream'. Somit haben alle Elemente in Ihrem 'timeWindow' genau den gleichen Schlüssel. – Patze

+0

Sie haben richtig verstanden. Ich möchte, dass jedes Schiebefenster mehrere Tasten hat. Bei einem Stream möchte ich alle möglichen Schlüsselpaare erstellen und diese Paare in einem gleitenden Fenster zusammen verarbeiten. –

Antwort

2

Die keyBy() im Streaming-Kontext hat eine vergleichbare Wirkung auf die groupBy() im Batch-Verarbeitung Kontext. Basierend auf dem KeySelector, den Sie bereitstellen, wird der Stream in mehrere Sub-Streams partitioniert. Diese werden dann in Ihre timeWindow eingegeben. Also, was Sie gerade in Ihrem Beispiel tun, ist ein timeWindow auf einem KeyedStream. Alle Elemente, die in Ihre timeWindow gelangen und in die Funktion ausgegeben werden, die Sie später anwenden, haben denselben Schlüssel. Hier ist eine nette Einführung in die Fensterfunktion in Flink, die ausführlicher auf die Verwendung von Windows https://flink.apache.org/news/2015/12/04/Introducing-windows.html eingeht. Wenn Ihre Schlüssel semantische Informationen enthalten und Sie verschiedene Schlüssel innerhalb desselben Fensters haben möchten, können Sie einen künstlichen Schlüssel (z. B. eine einfache Ganzzahl) erstellen, den Sie Ihren Datensätzen zuweisen. Auf der Grundlage dieses Schlüssels haben Sie mehr Kontrolle über die Gruppierung und damit über die Stream-Partitionierung. Für Ihre abschließende Berechnung, die die Ergebnisse der vorherigen Schritte verwendet und sie verbindet, benötigen Sie einen zusätzlichen Schritt (z. B. join oder reduce). Werfen Sie einen Blick auf das erste Beispiel hier: https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/datastream_api.html Es zählt alle Elemente mit einem bestimmten Schlüssel über eine timeWindow von 5 Sekunden mit der sum() Funktion. Das Ergebnis enthält ein Element pro Schlüssel pro Fenster.

+0

Wenn Ihre Schlüssel semantische Informationen enthalten und Sie verschiedene Schlüssel innerhalb desselben Fensters haben möchten, können Sie einen künstlichen Schlüssel (z. B. eine einfache Ganzzahl) erstellen, den Sie Ihren Datensätzen zuweisen. Das ist ein sehr logischer Ansatz, aber was passiert, wenn Sie alle möglichen Paare zwischen den Schlüsseln wollen? Wie kann man das mit Flink umsetzen? –

+0

Wenn Sie sich das Ergebnis anschauen, das Sie aus der Operation 'sum()' im Beispiel der Flink-Dokumentation erhalten, erhalten Sie einen 'DataStream >'.Im Allgemeinen gibt 'sum()' einen 'Datastream' zurück und Sie können jede Transformation auf dem Ergebnis durchführen, das für' Datastreams' wie 'map()' oder 'flatMap' erlaubt ist. Die Release-Dokumentation hier https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/datastream_api.html gibt Ihnen einen schönen Überblick darüber, welche Operationen ausgeführt werden können, welche Eingaben und was daraus hervorgehen die Daten am Ende. – Patze

Verwandte Themen