2017-12-16 4 views
1

Der Datenstrom wird partitioniert und zur Verarbeitung an jeden Slot verteilt. Jetzt kann ich das Ergebnis jeder partitionierten Aufgabe erhalten. Was ist der beste Ansatz, um eine Funktion auf das Ergebnis verschiedener Partitionen anzuwenden und ein globales Ergebnis zu erhalten?Flink: Wie fasst man das Ergebnis aller Partitionen am besten zusammen?

Aktualisiert: Ich möchte einige Daten Zusammenfassung Algorithmus wie Misra-Gries in Flink implementieren. Es wird k Zähler beibehalten und mit eingehenden Daten aktualisiert. Da Daten möglicherweise groß skalierbar sind, ist es besser, dass jede Partition ihre eigenen k-Zähler hat und parallel verarbeitet. Schließe diese Zähler schließlich mit den letzten k Zählern zusammen, um das Ergebnis zu präsentieren. Was ist der beste Weg, eine Kombination zu machen?

Antwort

1

Flink eingebauten in Aggregationsfunktionen, wie reduce, sum und max sind oben auf Flink des verwalteten verkeilten Zustand Mechanismus gebaut, und nur zu einem KeyedStream angewendet werden kann. Was Sie jedoch tun können, ist entweder WindowAll oder ProcessFunction. Hier ein Beispiel:

parallelStream 
    .process(new MyProcessFunction()) 
    .setParallelism(1) 
    .print() 
    .setParallelism(1); 

beachte, dass alle der vorläufigen Verarbeitung wird an dem Standard Parallelität durchgeführt werden, und dann wird die Prozessfunktion und Druck werden seriell angelegt.

Die ProcessFunction sollte ihren Zustand in managed operator (non-keyed) state behalten, um fehlertolerant zu sein.

Dies erzeugt einen kontinuierlich aktualisierten Strom von Zusammenfassungen über den gesamten Eingang. Verwenden Sie etwas wie countWindowAll oder timeWindowAll, wenn Sie es vorziehen, Zusammenfassungen über Windows zu erstellen.

+0

Nach meinem ersten Operator, bekomme ich aktualisierte Zusammenfassung Strom von mehreren Partition. Wie kann ich das neueste Element in jeder Partition aufnehmen und eine Funktion auf dieses Element anwenden? Zum Beispiel, wenn ich eine Parallelität von 2, nach einem Kartenoperator habe, werde ich zwei partitionierte Zusammenfassung Stream (1,2,3,4,5 ...), (7,8,9,10,11 .. .). Wie kann ich das neueste Element jedes Streams abrufen und seine Summe als neuen Stream berechnen? Wie (1 + 7, 2 + 8, 3 + 9, 3 + 10, 4 + 10, 4 + 11, 5 + 11 ....) so? Ich weiß nicht, ob ich es klar entschuldige, sorry ...... – Snakienn

+0

Für diesen speziellen Fall könnten Sie zum Beispiel eine RichCoFlatMap oder eine CoProcessFunction verwenden, um eine solche Reißverschluss-ähnliche Merging-Summe zu implementieren. Die Elemente aus jeder Partition bleiben in der richtigen Reihenfolge, aber ein Stream kann sich gegenseitig überlappen. Daher müssen Sie Elemente in einer Warteschlange zwischenspeichern, bis das entsprechende Element von der anderen Partition kommt. –

+0

Beachten Sie, dass Sie, wenn der Stream nach einem Schlüssel organisiert ist, etwas einfacheres tun können, indem Sie reduce oder sum verwenden. Siehe https://ci.apache.org/projects/flink/flink-docs-release-1.4/dev/stream/operators/index.html#datastream-transformations. –

Verwandte Themen