Was ist / sind die Hauptunterschiede zwischen Flink und Storm?

137

Flink wurde mit Spark verglichen , was meines Erachtens der falsche Vergleich ist, da es ein Fenster-Ereignisverarbeitungssystem mit Micro-Batching vergleicht. Ebenso macht es für mich nicht so viel Sinn, Flink mit Samza zu vergleichen. In beiden Fällen wird eine Echtzeit- mit einer Stapelverarbeitungsstrategie verglichen, auch wenn sie im Fall von Samza in einem kleineren "Maßstab" vorliegt. Aber ich würde gerne wissen, wie Flink mit Storm verglichen wird, das konzeptionell viel ähnlicher zu sein scheint.

Ich habe festgestellt, dass dies (Folie 4) den Hauptunterschied als "einstellbare Latenz" für Flink dokumentiert. Ein weiterer Hinweis scheint ein Artikel von Slicon Angle zu sein , der darauf hinweist , dass sich Flink besser in eine Spark- oder HadoopMR-Welt integrieren lässt, aber keine tatsächlichen Details erwähnt oder referenziert werden. Schließlich stellt Fabian Hueske selbst in einem Interview fest, dass "im Vergleich zu Apache Storm die Stream-Analyse-Funktionalität von Flink eine API auf hoher Ebene bietet und eine leichtere Fehlertoleranzstrategie verwendet, um genau einmalige Verarbeitungsgarantien bereitzustellen."

All das ist ein bisschen spärlich für mich und ich verstehe den Punkt nicht ganz. Kann jemand erklären, welche Probleme bei der Stream-Verarbeitung in Storm von Flink genau gelöst werden? Worauf bezieht sich Hueske mit den API-Problemen und ihrer "leichteren Fehlertoleranzstrategie"?

fnl
quelle
2
Beachten Sie, dass Apache Spark (der Fokus der verknüpften Frage) nicht mit Apache Storm (diese Frage hier) identisch ist. Nein, dies ist also keineswegs ein Duplikat.
fnl

Antworten:

210

Haftungsausschluss : Ich bin ein Apache Flink-Committer und PMC-Mitglied und nur mit Storms High-Level-Design vertraut, nicht mit seinen Interna.

Apache Flink ist ein Framework für die einheitliche Stream- und Stapelverarbeitung. Die Laufzeit von Flink unterstützt beide Domänen nativ aufgrund von Pipeline-Datenübertragungen zwischen parallelen Tasks, einschließlich Pipeline-Shuffles. Datensätze werden sofort von der Erstellung von Aufgaben zum Empfang von Aufgaben versendet (nachdem sie in einem Puffer für die Netzwerkübertragung gesammelt wurden). Stapeljobs können optional mit blockierenden Datenübertragungen ausgeführt werden.

Apache Spark ist ein Framework, das auch die Stapel- und Stream-Verarbeitung unterstützt. Die Batch-API von Flink sieht ziemlich ähnlich aus und behandelt ähnliche Anwendungsfälle wie Spark, unterscheidet sich jedoch in den Interna. Für das Streaming verfolgen beide Systeme sehr unterschiedliche Ansätze (Mini-Batches vs. Streaming), wodurch sie für verschiedene Arten von Anwendungen geeignet sind. Ich würde sagen, dass der Vergleich von Spark und Flink gültig und nützlich ist. Spark ist jedoch nicht die ähnlichste Stream-Verarbeitungs-Engine wie Flink.

Apache Storm ist ein Datenstromprozessor ohne Batch-Funktionen. Tatsächlich ähnelt der Pipeline-Motor von Flink intern Storm ein wenig, dh die Schnittstellen der parallelen Aufgaben von Flink ähneln denen von Storm. Storm und Flink haben gemeinsam, dass sie eine Stream-Verarbeitung mit geringer Latenz durch Pipeline-Datenübertragungen anstreben. Flink bietet jedoch im Vergleich zu Storm eine API auf höherer Ebene. Anstatt die Funktionalität eines Bolzens mit einem oder mehreren Lesegeräten und Kollektoren zu implementieren, bietet die DataStream-API von Flink Funktionen wie Map, GroupBy, Window und Join. Viele dieser Funktionen müssen bei Verwendung von Storm manuell implementiert werden. Ein weiterer Unterschied ist die Verarbeitungssemantik. Storm garantiert mindestens einmalige Verarbeitung, während Flink genau einmal liefert. Die Implementierungen, die diese Verarbeitungsgarantien geben, unterscheiden sich erheblich. Während Storm Bestätigungen auf Datensatzebene verwendet, verwendet Flink eine Variante des Chandy-Lamport-Algorithmus. Kurz gesagt, Datenquellen fügen regelmäßig Markierungen in den Datenstrom ein. Immer wenn ein Bediener eine solche Markierung erhält, überprüft er seinen internen Zustand. Wenn ein Marker von allen Datensenken empfangen wurde, werden der Marker (und alle zuvor verarbeiteten Datensätze) festgeschrieben. Im Falle eines Fehlers werden alle Quellenoperatoren auf ihren Status zurückgesetzt, als sie den letzten festgeschriebenen Marker gesehen haben, und die Verarbeitung wird fortgesetzt. Dieser Marker-Checkpoint-Ansatz ist leichter als Storms Bestätigungen auf Rekordniveau. Dies Datenquellen fügen regelmäßig Markierungen in den Datenstrom ein. Immer wenn ein Bediener eine solche Markierung erhält, überprüft er seinen internen Zustand. Wenn ein Marker von allen Datensenken empfangen wurde, werden der Marker (und alle zuvor verarbeiteten Datensätze) festgeschrieben. Im Falle eines Fehlers werden alle Quellenoperatoren auf ihren Status zurückgesetzt, als sie den letzten festgeschriebenen Marker gesehen haben, und die Verarbeitung wird fortgesetzt. Dieser Marker-Checkpoint-Ansatz ist leichter als Storms Bestätigungen auf Rekordniveau. Dies Datenquellen fügen regelmäßig Markierungen in den Datenstrom ein. Immer wenn ein Bediener eine solche Markierung erhält, überprüft er seinen internen Zustand. Wenn ein Marker von allen Datensenken empfangen wurde, werden der Marker (und alle zuvor verarbeiteten Datensätze) festgeschrieben. Im Falle eines Fehlers werden alle Quellenoperatoren auf ihren Status zurückgesetzt, als sie den letzten festgeschriebenen Marker gesehen haben, und die Verarbeitung wird fortgesetzt. Dieser Marker-Checkpoint-Ansatz ist leichter als Storms Bestätigungen auf Rekordniveau. Dies Alle Quellenbetreiber werden auf ihren Status zurückgesetzt, als sie den letzten festgeschriebenen Marker gesehen haben, und die Verarbeitung wird fortgesetzt. Dieser Marker-Checkpoint-Ansatz ist leichter als Storms Bestätigungen auf Rekordniveau. Dies Alle Quellenbetreiber werden auf ihren Status zurückgesetzt, als sie den letzten festgeschriebenen Marker gesehen haben, und die Verarbeitung wird fortgesetzt. Dieser Marker-Checkpoint-Ansatz ist leichter als Storms Bestätigungen auf Rekordniveau. DiesDer Foliensatz und der entsprechende Vortrag erläutern den Streaming-Verarbeitungsansatz von Flink, einschließlich Fehlertoleranz, Checkpointing und Statusbehandlung.

Storm bietet auch eine genau einmalige High-Level-API namens Trident. Trident basiert jedoch auf Mini-Batches und ist daher Spark ähnlicher als Flink.

Die einstellbare Latenz von Flink bezieht sich auf die Art und Weise, wie Flink Datensätze von einer Aufgabe zur anderen sendet. Ich habe bereits gesagt, dass Flink Pipeline-Datenübertragungen verwendet und Datensätze weiterleitet, sobald sie erstellt wurden. Aus Effizienzgründen werden diese Datensätze in einem Puffer gesammelt, der über das Netzwerk gesendet wird, sobald es voll ist oder ein bestimmter Zeitschwellenwert erreicht ist. Dieser Schwellenwert steuert die Latenz von Datensätzen, da er die maximale Zeit angibt, die ein Datensatz in einem Puffer verbleibt, ohne an die nächste Aufgabe gesendet zu werden. Es kann jedoch nicht verwendet werden, um feste Garantien für die Zeit zu geben, die ein Datensatz vom Aufrufen bis zum Verlassen eines Programms benötigt, da dies unter anderem auch von der Verarbeitungszeit innerhalb von Aufgaben und der Anzahl der Netzwerkübertragungen abhängt.

Fabian Hueske
quelle
2
Danke vielmals! Ein offener Punkt vielleicht, wenn ich Sie noch einmal stören darf: Worum geht es bei diesem Problem mit der "einstellbaren Latenz"? Dies scheint ziemlich relevant zu sein, da unterschiedliche Anwendungsdomänen diesbezüglich unterschiedliche Anforderungen haben. Können Sie erklären, was dies zumindest in Bezug auf Flink bedeutet?
fnl
6
Klar, ich habe meine Antwort erweitert und die einstellbare Latenz besprochen. Lassen Sie mich wissen, wenn Sie weitere Fragen haben.
Fabian Hueske
Ermöglicht Flink "heiße" Änderungen am DAG-Workflow, wie sie beispielsweise mit Erlang implementiert werden können? IE. Kann man die DAG zur Laufzeit ändern?
Thomas Browne
1
Ein Hot-Code-Austausch ist nicht möglich. Sie können jedoch den Status einer Anwendung als Sicherungspunkt beibehalten. Der Sicherungspunkt kann zum Starten einer geänderten Anwendung verwendet werden. Dies kann erfolgen, während die ursprüngliche Anwendung noch ausgeführt wird, sodass die Ausgabe irgendwann gespiegelt werden kann. Beachten Sie, dass Apps nicht willkürlich geändert werden können, wenn Sie von einem vorhandenen Sicherungspunkt aus fortfahren.
Fabian Hueske
1
Interessanter und großer Vorteil von Flink ist die Fähigkeit, Apache Beam mit einer noch höheren API auszuführen. Es ist einer der reichsten und vollständigsten Läufer für Beam.
Piotr Gwiazda
47

Zur Antwort von Fabian Hueske hinzufügen:

Flink verbessert Storm zusätzlich auch auf folgende Weise:

  • Gegendruck: Die Streaming-Laufzeit von Flink verhält sich gut, wenn verschiedene Operatoren mit unterschiedlichen Geschwindigkeiten ausgeführt werden, da Downstream-Operatoren Upstream-Operatoren sehr gut unter Druck setzen, obwohl die Netzwerkschicht Pufferpools verwaltet.

  • Benutzerdefinierter Status: Mit Flink können Programme den benutzerdefinierten Status in Ihren Operatoren beibehalten. Dieser Status kann tatsächlich am Checkpointing auf Fehlertoleranz teilnehmen und bietet genau einmalige Garantien für einen benutzerdefinierten benutzerdefinierten Status. Sehen Sie sich dieses Beispiel einer benutzerdefinierten Zustandsmaschine in einem Operator an, die zusammen mit dem Datenstrom konsistent überprüft wird.

  • Streaming-Fenster: Stream-Fenster und Fensteraggregationen sind ein entscheidender Baustein für die Analyse von Datenströmen. Flink wird mit einem recht leistungsstarken Fenstersystem geliefert, das viele Fenstertypen unterstützt.

Stephan Ewen
quelle
2
In Bezug auf Ihren ersten Punkt ist Storm unter Gegendruck ab 1.0 (veröffentlicht im April 2016)
Colin Nichols
Der Gegendruck im Sturm kann mithilfe der Eigenschaft "spout_max_pending" verringert werden. Es legt einen Schwellenwert für die maximalen Tupel fest, die in einem Auslauf vorhanden sein können, dessen Bestätigung noch aussteht. Der Auslauf verbraucht in Zukunft keine Tupel mehr, bis die Bestätigung erfolgt.
Aman Garg
3

Basierend auf meiner Erfahrung mit Storm and Flink. Ich bin der Meinung, dass diese Tools dasselbe Problem mit unterschiedlichen Ansätzen lösen können. Alle von @Stephan Ewen erwähnten Funktionen von Flink können jetzt von Storm mit der internen API (dh Spolts und Bolzen ) und der Trident- API abgeglichen werden . Jemand behauptet, Trident sei im Mini-Batch-Stil, während ich denke, dass die meisten komplexen Apps mit zustandsbezogener oder Aggregation nur von der Batch-Verarbeitung mit Fensterstil abhängen könnten. Deshalb liste ich hier nur einige Hauptunterschiede auf, ohne zu sagen, was besser ist.

  • Entwicklungsstil . Computerorientiert (z. B. verkettbarer Operator) in Flink vs. Datenstromorientiert (z. B. addSpolt()/addBolt()) in Storm.
  • High-Level-API . Funktionen (z. B. Karte, Fenster, Streaming-Level beitreten) in Flink vs. Native Window und Trident in Storm.
  • Garantierte Nachrichtenverarbeitung (GMP, dh genau einmal ) . Checkpoint mit Two-Phase Commit Connector (z. B. KafkaConsumer) in Flink vs. Tuple-Tree mit der externen Zustandsmaschine oder Trident in Storm.
  • Fehlertoleranz . Marker-Checkpoint in Flink vs. ACK auf Rekordniveau in Storm.
  • Interne Architektur . Einfache Abstraktion und relative Parallelität (z. B. Steckplatz für jeden mit CPU-Kernen berücksichtigten Thread) in Flink vs. Mehrschichtige Abstraktionen (z. B. Steckplatz für jede JVM als Worker in Supervisor und jeder Supervisor kann viele Worker haben) in Storm.
LeoZhang
quelle
3

Haftungsausschluss: Ich bin ein Mitarbeiter von Cloudera, einem wichtigen Unterstützer von Storm und (bald) Flink.

Funktionell

Viele gute technische Punkte wurden bereits vorgestellt. Eine sehr kurze Zusammenfassung der Highlights:

  • Sowohl Flink als auch Storm können pro Ereignis verarbeitet werden
  • Storm scheint die sofort einsatzbereite Ereigniszeit nicht zu unterstützen
  • Storm hat die SQL-Unterstützung nicht aus dem experimentellen Stadium gehoben

Nicht funktionsfähig

  • Viele Kunden fanden Storm (zu) schwer zu bedienen
  • Die Sturmadoption verlangsamte sich und die Community von Flink scheint jetzt aktiver zu sein als Storm
  • Flink hat noch Nachholbedarf (z. B. dokumentierte Beispiele), aber insgesamt hat es in fast allen Bereichen aufgeholt, an die Sie vielleicht denken

Fazit

Cloudera hat kürzlich die Abwertung von Storm (in HDP) angekündigt. Gleichzeitig wurde Flink als Nachfolger bekannt gegeben.

Wenn Sie also Sturmfälle haben, funktionieren diese natürlich weiter. Aber für neue Anwendungsfälle würde ich mich mit Flink oder anderen Streaming-Engines befassen.

Dennis Jaheruddin
quelle