Nachdem dieser Code ausgeführt wurde, wurde die Streamingberechnung im Hintergrund gestartet. Das Abfrageobjekt ist ein Handle für diese aktive Streamingabfrage, und wir haben uns entschieden, auf die Beendigung der Abfrage mit awaitTermination() zu warten, um zu verhindern, dass der Prozess beendet wird, während die Abfrage aktiv ist. Ein Trigger definiert das Timing der Streaming-Datenverarbeitung. Wenn Sie ein zu kleines Triggerintervall angeben, führt das System möglicherweise unnötige Überprüfungen durch, um festzustellen, ob neue Daten eintreffen. Als bewährte Methode wird empfohlen, einen maßgeschneiderten Trigger anzugeben, um die Kosten zu minimieren. Definieren Sie Wasserzeichenverzögerungen für beide Eingaben, sodass das Modul weiß, wie verzögert die Eingabe sein kann (ähnlich wie Streaming-Aggregationen) Ausführungssemantik Wenn die Streaming-Abfrage gestartet wird, ruft Spark die Funktion oder die Methoden des Objekts wie folgt auf: Sie können auch alle Abfragen, die einer SparkSession zugeordnet sind, asynchron überwachen, indem Sie einen StreamingQueryListener (Scala/Java docs) anfügen. Nachdem Sie Ihr benutzerdefiniertes StreamingQueryListener-Objekt an sparkSession.streams.attachListener() angefügt haben, erhalten Sie Rückrufe, wenn eine Abfrage gestartet und beendet wird und wenn in einer aktiven Abfrage Fortschritt erzielt wird. Hier ist ein Beispiel, Sortiervorgänge werden für Streaming-Datasets nur nach einer Aggregation und im vollständigen Ausgabemodus unterstützt. Die Materialisierung wird synchron auf dem Materialisierenden durch einen globalen ActorSystem Materializer durchgeführt.

Die eigentliche Streamverarbeitung wird von Akteuren verarbeitet, die während der Stream-Materialisierung gestartet werden, die auf den Threadpools ausgeführt wird, für die sie konfiguriert wurden , was standardmäßig den Dispatcher-Satz in der ActorSystem-Konfiguration oder als Attribute für den Stream bereitgestellt, der materialisiert wird. Bei Junctions, die mehrere Eingangsströme verarbeiten (z. B. Merge), ist die Ausgabereihenfolge jedoch im Allgemeinen nicht für Elemente definiert, die an verschiedenen Eingangsports ankommen. Das ist eine zusammenführungsähnliche Operation kann Ai aussenden, bevor Bi emittiert wird, und es liegt an seiner internen Logik, die Reihenfolge der emittierten Elemente zu bestimmen. Spezialisierte Elemente wie Zip garantieren jedoch deren Ausgabereihenfolge, da jedes Ausgabeelement davon abhängt, dass alle vorgeschalteten Elemente bereits signalisiert wurden – so wird die Reihenfolge im Falle des Zippens durch diese Eigenschaft definiert. Es gibt verschiedene Möglichkeiten, verschiedene Teile eines Streams zu verdrahten, die folgenden Beispiele zeigen einige der verfügbaren Optionen: Ein wichtiger Aspekt der Arbeit mit Streams und Akteuren ist das Verständnis des Lebenszyklus eines Materializers. Der Materialisierer ist an den Lebenszyklus der ActorRefFactory gebunden, aus der er erstellt wurde, die in der Praxis entweder ein ActorSystem oder ActorContext sein wird (wenn der Materialisierer in einem Actor erstellt wird).

Stream-Stream-Join: Z. B. sdf1.join(sdf2, …) (d.h. beide Eingänge werden mit sparkSession.readStream generiert). Änderungen in den Schema- oder Äqui-Verknüpfungsspalten sind nicht zulässig. Änderungen des Verknüpfungstyps (außen oder innen) sind nicht zulässig. Andere Änderungen in der Join-Bedingung sind nicht definiert. Wenn Sie einen dieser Vorgänge ausprobieren, wird eine AnalysisException wie „Operation XYZ wird beim Streaming von DataFrames/Datasets nicht unterstützt“ angezeigt. Während einige von ihnen in zukünftigen Versionen von Spark unterstützt werden können, gibt es andere, die grundsätzlich schwer auf Streaming-Daten effizient zu implementieren sind.

Beispielsweise wird das Sortieren des Eingabestreams nicht unterstützt, da alle im Stream empfangenen Daten nachverfolgt werden müssen. Dies ist daher grundsätzlich schwer effizient umzusetzen. Die Grundidee in Structured Streaming ist es, einen Live-Datenstrom als Tabelle zu behandeln, die kontinuierlich angehängt wird. Dies führt zu einem neuen Streamverarbeitungsmodell, das einem Stapelverarbeitungsmodell sehr ähnlich ist. Sie drücken Ihre Streaming-Berechnung als standardbatchartige Abfrage wie in einer statischen Tabelle aus, und Spark führt sie als inkrementelle Abfrage für die ungebundene Eingabetabelle aus.