Dieser Beitrag ist eine Gastpublikation von Yaroslav Tkachenko, einem Softwarearchitekten bei Activision.
Apache Spark ist eines der beliebtesten und leistungsfähigsten Frameworks für die Datenverarbeitung in großem Maßstab. Es wurde als Alternative zum MapReduce-Framework von Hadoop für Batch-Workloads entwickelt, unterstützt jetzt aber auch SQL, maschinelles Lernen und Stream-Verarbeitung. Heute möchte ich mich auf das Spark-Streaming konzentrieren und einige Optionen für die Stream-Verarbeitung zeigen.
Stream-Datenverarbeitung wird verwendet, wenn dynamische Daten kontinuierlich generiert werden, und sie wird häufig in Big-Data-Anwendungsfällen gefunden. Die aus den Daten abgeleiteten Erkenntnisse werden auch verwendet, um Warnungen bereitzustellen, Dashboards zu rendern und Modelle für maschinelles Lernen einzuspeisen, die schnell auf neue Trends in den Daten reagieren können.
DStreams vs. DataFrames
Spark Streaming wurde mit Spark 0.7.0 alpha. Es basiert auf der Idee von diskretisierten Streams oder DStreams. Jeder DStream wird als Folge von RDDs dargestellt, sodass er einfach zu verwenden ist, wenn Sie von RDD-unterstützten Batch-Workloads auf niedriger Ebene stammen. DStreams hat in diesem Zeitraum viele Verbesserungen erfahren, aber es gab immer noch verschiedene Herausforderungen, vor allem, weil es sich um eine sehr Low-Level-API handelt.
Als Lösung für diese Herausforderungen wurde Spark Structured Streaming in Spark 2.0 als Erweiterung auf Spark SQL eingeführt (und in 2.2 stabil). Aus diesem Grund nutzt es Spark SQL-Code und Speicheroptimierungen. Strukturiertes Streaming bietet auch sehr leistungsstarke Abstraktionen wie Dataset / DataFrame-APIs sowie SQL. Kein direkter Umgang mehr mit RDD!
Sowohl strukturiertes Streaming als auch Streaming mit DStreams verwenden Micro-Batching. Der größte Unterschied besteht in der Latenz und den Garantien für die Nachrichtenübermittlung: Strukturiertes Streaming bietet eine einmalige Zustellung mit einer Latenz von mehr als 100 Millisekunden, während das Streaming mit DStreams-Ansatz nur eine mindestens einmalige Zustellung garantiert, aber Millisekunden-Latenzen bereitstellen kann.
Ich persönlich bevorzuge Spark Structured Streaming für einfache Anwendungsfälle, aber Spark Streaming mit DStreams ist aufgrund seiner Flexibilität wirklich gut für kompliziertere Topologien. Aus diesem Grund möchte ich im Folgenden zeigen, wie Streaming mit DStreams und Streaming mit DataFrames (das normalerweise mit Spark Structured Streaming verwendet wird) zum Konsumieren und Verarbeiten von Daten aus Apache Kafka verwendet wird. Ich werde Scala, Apache Spark 2.3 und Apache Kafka 2.0 verwenden.
Zum Beispiel werde ich meine Jobs mit Apache Zeppelin Notebooks ausführen, die von Qubole bereitgestellt werden. Qubole ist eine Datenplattform, die ich täglich nutze. Es verwaltet Hadoop- und Spark-Cluster, erleichtert die Ausführung von Ad-hoc-Hive- und Presto-Abfragen und bietet auch verwaltete Zeppelin-Notebooks, die ich gerne verwende. Mit Qubole muss ich nicht viel über die Konfiguration und Abstimmung von Spark und Zeppelin nachdenken, es ist nur für mich erledigt.
Der tatsächliche Anwendungsfall, den ich habe, ist sehr einfach:
- Eine Art Telemetrie wird in Kafka geschrieben: kleine JSON—Nachrichten mit Metadaten und beliebigen Schlüssel / Wert-Paaren
- Ich möchte eine Verbindung zu Kafka herstellen, diese Nachrichten konsumieren und deserialisieren
- Wenden Sie dann bei Bedarf Transformationen an
- Sammeln Sie einige Aggregationen
- Schließlich interessiere ich mich für Anomalien und allgemein schlechte Daten – da ich den Produzenten nicht kontrolliere, möchte ich Dinge wie Nullen, leere Zeichenfolgen, möglicherweise falsche Daten und andere Werte mit bestimmten Formaten , etc.
- Der Job sollte einige Zeit laufen und dann automatisch beendet werden. Normalerweise werden Spark-Streaming-Jobs kontinuierlich ausgeführt, aber manchmal kann es nützlich sein, sie ad hoc für die Analyse / das Debuggen auszuführen (oder als Beispiel in meinem Fall, da es so einfach ist, einen Spark-Job in einem Notebook auszuführen).
Streaming mit DStreams
In diesem Ansatz verwenden wir DStreams, das einfach eine Sammlung von RDDs ist.
Streaming mit DataFrames
Jetzt können wir versuchen, Streaming mit DataFrames API zu kombinieren, um das Beste aus beiden Welten zu erhalten!
Fazit
Welcher Ansatz ist besser? Da DStream nur eine Sammlung von RDDs ist, wird es normalerweise für Low-Level-Transformationen und -Verarbeitung verwendet. Das Hinzufügen einer DataFrames-API darüber hinaus bietet sehr leistungsstarke Abstraktionen wie SQL, erfordert jedoch etwas mehr Konfiguration. Und wenn Sie einen einfachen Anwendungsfall haben, ist Spark Structured Streaming im Allgemeinen möglicherweise eine bessere Lösung!