DStreams vs. DataFrames: Two Flavors of Spark Streaming

aug 5, 2021
admin

Dit bericht is een gastpublicatie geschreven door Yaroslav Tkachenko, een Software Architect bij Activision.

Apache Spark is een van de meest populaire en krachtige grootschalige dataverwerkingsframeworks. Het is gemaakt als alternatief voor Hadoop’s MapReduce framework voor batch workloads, maar nu ondersteunt het ook SQL, machine learning, en stream processing. Vandaag wil ik me richten op Spark Streaming en een paar opties laten zien die beschikbaar zijn voor stream processing.

Stream data processing wordt gebruikt wanneer dynamische data continu wordt gegenereerd, en het wordt vaak gevonden in big data use cases. In de meeste gevallen worden gegevens bijna real-time verwerkt, één record per keer, en de inzichten die uit de gegevens worden afgeleid, worden ook gebruikt om waarschuwingen te geven, dashboards te maken en modellen voor machinaal leren te voeden die snel kunnen reageren op nieuwe trends in de gegevens.

DStreams vs. DataFrames

Spark Streaming ging alpha met Spark 0.7.0. Het is gebaseerd op het idee van discrete streams of DStreams. Elke DStream wordt gerepresenteerd als een opeenvolging van RDDs, dus het is makkelijk te gebruiken als je afkomstig bent van low-level RDD-gebaseerde batch workloads. DStreams heeft in die periode veel verbeteringen ondergaan, maar er waren nog steeds verschillende uitdagingen, vooral omdat het een zeer low-level API is.

Als oplossing voor die uitdagingen werd Spark Structured Streaming geïntroduceerd in Spark 2.0 (en werd stabiel in 2.2) als een uitbreiding die bovenop Spark SQL is gebouwd. Hierdoor maakt het gebruik van Spark SQL code en geheugen optimalisaties. Structured Streaming biedt ook zeer krachtige abstracties zoals Dataset/DataFrame API’s en SQL. Je hoeft niet meer direct met RDD’s om te gaan!

Zowel Structured Streaming als Streaming met DStreams gebruiken micro-batching. Het grootste verschil is de latency en de garanties voor de aflevering van berichten: Structured Streaming biedt exact één keer levering met 100+ milliseconden latency, terwijl de Streaming met DStreams aanpak alleen minimaal één keer levering garandeert, maar milliseconde latencies kan bieden.

Ik persoonlijk geef de voorkeur aan Spark Structured Streaming voor eenvoudige use cases, maar Spark Streaming met DStreams is echt goed voor meer gecompliceerde topologieën vanwege zijn flexibiliteit. Daarom wil ik hieronder laten zien hoe ik Streaming met DStreams en Streaming met DataFrames (die meestal wordt gebruikt met Spark Structured Streaming) kan gebruiken voor het consumeren en verwerken van data uit Apache Kafka. Ik ga Scala, Apache Spark 2.3, en Apache Kafka 2.0 gebruiken.

Ook zal ik omwille van het voorbeeld mijn jobs uitvoeren met Apache Zeppelin notebooks die door Qubole worden geleverd. Qubole is een dataplatform dat ik dagelijks gebruik. Het beheert Hadoop en Spark clusters, maakt het gemakkelijk om ad hoc Hive en Presto queries uit te voeren, en biedt ook beheerde Zeppelin notebooks die ik graag gebruik. Met Qubole hoef ik niet veel na te denken over het configureren en tunen van Spark en Zeppelin, het wordt gewoon voor me afgehandeld.

De werkelijke use case die ik heb is heel eenvoudig:

  • Een soort telemetrie wordt naar Kafka geschreven: kleine JSON-berichten met metadata en willekeurige sleutel/waarde-paren
  • Ik wil verbinding maken met Kafka, die berichten consumeren en deserialiseren
  • Dan indien nodig transformaties toepassen
  • En wat aggregaties verzamelen
  • Finitief, Ik ben geïnteresseerd in anomalieën en over het algemeen slechte gegevens – aangezien ik de producent niet controleer, wil ik dingen zoals NULLs, lege strings, misschien onjuiste datums en andere waarden met specifieke formaten, enz. opvangen.
  • De opdracht moet enige tijd lopen en dan automatisch worden beëindigd. Normaal gesproken worden Spark Streaming jobs continu uitgevoerd, maar soms kan het handig zijn om ze ad hoc uit te voeren voor analyse/debugging (of als voorbeeld in mijn geval, omdat het zo makkelijk is om een Spark job in een notebook uit te voeren).

Streaming met DStreams

In deze aanpak gebruiken we DStreams, wat gewoon een verzameling RDDs is.

Streaming met DataFrames

Nu kunnen we proberen om Streaming te combineren met DataFrames API om het beste van twee werelden te krijgen!

Conclusie

Welke aanpak is beter? Omdat DStream slechts een verzameling RDDs is, wordt het meestal gebruikt voor low-level transformaties en verwerking. Het toevoegen van een DataFrames API bovenop dat biedt zeer krachtige abstracties zoals SQL, maar vereist een beetje meer configuratie. En als je een eenvoudige use case hebt, is Spark Structured Streaming misschien een betere oplossing in het algemeen!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.