8

Was ist der Unterschied zwischen Mini-Batch vs Echtzeit-Streaming in der Praxis (nicht Theorie)? Theoretisch verstehe ich Mini-Batch ist etwas, das in dem gegebenen Zeitrahmen, während Echtzeit-Streaming ist eher wie etwas tun, wie die Daten ankommt, aber meine größte Frage ist, warum nicht Mini-Batch mit Epsilon Zeitrahmen (sagen wir eine Millisekunde) oder ich möchte den Grund verstehen, warum man eine effektive Lösung als andere wäre?Was ist der Unterschied zwischen Mini-Batch und Echtzeit-Streaming in der Praxis (nicht Theorie)?

Ich bin kürzlich auf ein Beispiel gestoßen, wo Mini-Batch (Apache Spark) für Betrugserkennung und Echtzeit-Streaming (Apache Flink) für die Betrugsprävention verwendet wird. Jemand sagte auch, dass das Sagen von Mini-Batches keine effektive Lösung für die Betrugsprävention wäre (da das Ziel darin besteht, die Transaktion so zu verhindern, wie sie passierte). Nun frage ich mich, warum dies mit Mini-Batch (Spark) nicht so effektiv wäre? Warum ist es nicht effektiv, Minibatch mit einer Latenz von 1 Millisekunde auszuführen? Batching ist eine Technik, die überall verwendet wird, einschließlich des Betriebssystems und des Kernel-TCP/IP-Stacks, wo die Daten auf der Festplatte oder im Netzwerk tatsächlich gepuffert sind. Was ist der überzeugende Faktor, um einen effektiver zu machen?

Antwort

7

Haftungsausschluss: Ich bin ein Committer und PMC Mitglied von Apache Flink. Ich bin mit dem Gesamtdesign von Spark Streaming vertraut, kenne aber seine Interna nicht im Detail.

Das Mini-Batch-Stream-Verarbeitungsmodell als arbeitet von Spark Streaming wie folgt umgesetzt:

  • Aufzeichnungen eines Stroms in einem Puffer (Mini-Batch) gesammelt werden.
  • In regelmäßigen Abständen werden die gesammelten Datensätze mit einem regulären Spark-Job verarbeitet.Dies bedeutet, dass für jeden Minibatch ein kompletter verteilter Stapelverarbeitungsjob geplant und ausgeführt wird.
  • Während der Job ausgeführt wird, werden die Datensätze für den nächsten Stapel erfasst.

Also, warum ist es nicht effektiv, alle 1ms eine Minibatch zu betreiben? Ganz einfach, weil dies bedeuten würde, einen verteilten Stapeljob jede Millisekunde zu planen. Obwohl Spark sehr schnell Jobs plant, wäre das ein bisschen zu viel. Es würde auch den möglichen Durchsatz erheblich reduzieren. Batch-Techniken, die in OSs oder TCP verwendet werden, funktionieren auch nicht gut, wenn ihre Stapel zu klein werden.

+0

Vielen Dank für die Antwort, also wie Apache Flink tut besser als sagen, eine verteilte Batch-Job in diesem Fall jede Millisekunde planen? funktioniert Apache Flink überhaupt? – user1870400

+2

Flink terminiert einen Streaming-Job nur einmal und leitet die Datensätze kontinuierlich durch seine Operatoren. Flink bündelt Datensätze, um Daten über das Netzwerk zu senden, um die Netzwerkeffizienz zu verbessern. Dies funktioniert, indem Datensätze in einen Puffer (Standard 32 KB) und Versand dieser Puffer, sobald es voll ist. Es gibt auch eine Zeitüberschreitung, um den Puffer zu senden, falls der Strom nicht "schnell" genug ist. Diese Technik begrenzt die maximale Latenz. –

+0

Wenn zB 32Kb nicht erreicht wird (sagen Sie, es gibt nicht genug Anzahl von Nachrichten) Was ist Timeout-Zeit? und ist es konfigurierbar?Ich nehme an, dass ein Scheduler, der Jobs plant, kluge Entscheidungen darüber treffen kann, wo er planen muss, um Parallelität und Durchsatz auf mehreren Maschinen zu erhöhen. Wenn Apache Flink nur einmal plant, frage ich mich, wie er die Last auf die Maschinen verteilt, entweder zur Laufzeit des Jobs? – user1870400

3

Daran denke ich viel, denn die Antwort auf technische und nicht technische Menschen ist immer schwer zu formulieren.

Ich werde versuchen, diesen Teil zu beantworten:

Warum ist es nicht wirksam Mini-Batch mit 1 Millisekunde Latenzzeit zu laufen?

Ich glaube, das Problem liegt nicht am Modell selbst, sondern daran, wie Spark es implementiert. Es ist ein empirischer Beweis, dass die Leistung des Minibatchfensters zu sehr abnimmt und die Leistung abnimmt. In der Tat gab es eine vorgeschlagene Zeit von mindestens 0,5 Sekunden oder mehr, um diese Art von Verschlechterung zu verhindern. Bei großen Volumina war selbst diese Fenstergröße zu klein. Ich hatte nie die Chance, es in der Produktion zu testen, aber ich hatte nie eine starke Echtzeitanforderung.

Ich kenne Flink besser als Spark, also weiß ich nicht wirklich über seine Interna so gut, aber ich glaube, dass der Aufwand bei der Gestaltung des Batch-Prozesses irrelevant war, wenn Ihre Charge mindestens ein paar Sekunden braucht, um verarbeitet zu werden wird schwer, wenn sie eine feste Latenz einführen, und Sie können nicht darunter gehen. Um die Art dieser Gemeinkosten zu verstehen, müssen Sie, glaube ich, in die Spark-Dokumentation eintauchen, Code schreiben und Probleme lösen.

Die Industrie hat gerade erkannt, dass ein anderes Modell benötigt wird, und deshalb wachsen gerade viele "streaming-first" -Motoren mit Flink als Spitzenreiter. Ich glaube nicht, dass es nur Schlagworte und Hype sind, weil die Anwendungsfälle für diese Art von Technologie, zumindest für den Moment, extrem begrenzt sind. Wenn Sie eine automatisierte Entscheidung in Echtzeit für große, komplexe Daten benötigen, benötigen Sie eine schnelle Daten-Engine in Echtzeit. In jedem anderen Fall, einschließlich nahezu Echtzeit, ist Echtzeit-Streaming ein Overkill und Mini-Batch ist in Ordnung.

5

Ich weiß, dass eine Antwort akzeptiert wurde, aber ich denke, es muss noch eine mehr gesagt werden, um diese Frage vollständig zu beantworten. Ich denke, Antwort wie "Flink's Echtzeit ist schneller/besser für das Streaming" ist falsch, weil es stark darauf ankommt, was du machen willst.

Spark Mini-Batch-Modell hat - wie es in der vorherigen Antwort geschrieben - Nachteil, dass für jeden Mini-Batch muss ein neuer Job erstellt werden.

Allerdings hat Spark Structured Streaming Standard-Verarbeitungszeit Trigger auf 0 gesetzt, dh neue Daten werden so schnell wie möglich gelesen. Es bedeutet, dass:

  1. eine Abfrage startet
  2. Daten angekommen, aber erste Abfrage endete nicht
  3. erste Abfrage beendet, so werden die Daten immediatelly verarbeitet werden.

Die Latenz ist in solchen Fällen sehr gering.

Ein großer Vorteil gegenüber Flink ist, dass Spark einheitliche APIs für Batch-und Streaming-Verarbeitung, wegen dieser Mini-Batch-Modell hat. Sie können Batch-Jobs einfach in Streaming-Jobs umwandeln, Streaming-Daten mit alten Daten aus Batch hinzufügen. Es ist nicht möglich mit Flink zu arbeiten. Flink erlaubt Ihnen auch keine interaktiven Abfragen mit Daten, die Sie erhalten haben.

Wie gesagt, Anwendungsfälle unterschiedlich sind für Mikro-Chargen und Echtzeit-Streaming:

  1. Für sehr, sehr kleine Latenzen, Flink oder einigen Computational Grids, wie Apache Ignite wird gut sein. Sie eignen sich für die Verarbeitung mit sehr geringer Latenz, aber nicht mit sehr komplexen Berechnungen.
  2. Für mittlere und größere Latenzen, Spark mehr einheitliche API, die komplexere Berechnungen in der gleichen Weise, Batch-Jobs getan werden, gerade wegen dieser Vereinigung

Für weitere Informationen über Structured Streaming tun können bitte schauen Sie sich this blog post an

Verwandte Themen