This post is a guest publication written by Yaroslav Tkachenko, a Software Architect at Activision.
Apache Spark is een van de meest populaire en krachtige grootschalige gegevensverwerking frameworks. Het is gemaakt als een alternatief voor Hadoop ‘ s MapReduce framework voor batchworkloads, maar nu ondersteunt het ook SQL, machine learning en stream processing. Vandaag wil ik me concentreren op Spark Streaming en toon een paar opties beschikbaar voor stream processing.
Stroomgegevensverwerking wordt gebruikt wanneer dynamische gegevens continu worden gegenereerd, en het wordt vaak gevonden in big data use cases. In de meeste gevallen gegevens worden verwerkt in de buurt van real-time, een record op een moment, en de inzichten die zijn afgeleid van de gegevens worden ook gebruikt om waarschuwingen te bieden, maken dashboards, en voer machine learning modellen die snel kunnen reageren op nieuwe trends binnen de gegevens.
DStreams vs. DataFrames
Spark Streaming ging alpha met Spark 0.7.0. Het is gebaseerd op het idee van gediscretiseerde streams of DStreams. Elke DStream wordt weergegeven als een reeks RDDs, dus het is gemakkelijk te gebruiken als u afkomstig bent van low-level RDD-backed batch workloads. DStreams onderging veel verbeteringen in die periode, maar er waren nog steeds verschillende uitdagingen, voornamelijk omdat het een zeer laag niveau API.
als oplossing voor deze uitdagingen werd Spark Structured Streaming geïntroduceerd in Spark 2.0 (en werd stabiel in 2.2) als een uitbreiding gebouwd op Spark SQL. Vanwege dat, het maakt gebruik van Spark SQL code en geheugen optimalisaties. Gestructureerde Streaming geeft ook zeer krachtige abstracties zoals dataset / dataframe API ‘ s evenals SQL. Niet meer direct met RDD te maken!
zowel gestructureerde Streaming als Streaming met DStreams gebruiken microbatching. Het grootste verschil is latency en message delivery guarantees: Structured Streaming biedt precies-een keer levering met 100 + milliseconden latency, terwijl de streaming met DStreams aanpak alleen garandeert ten minste-een keer levering, maar kan bieden milliseconde latencies.
persoonlijk geef ik 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 je Streaming gebruikt met DStreams en Streaming met DataFrames (wat meestal gebruikt wordt met Spark Structured Streaming) voor het consumeren en verwerken van gegevens van Apache Kafka. Ik ga Scala, Apache Spark 2.3 en Apache Kafka 2.0 gebruiken.
om een voorbeeld te geven zal ik mijn taken ook uitvoeren met Apache Zeppelin notebooks van Qubole. Qubole is een Dataplatform dat ik dagelijks gebruik. Het beheert Hadoop en Spark clusters, maakt het gemakkelijk om ad hoc Hive en Presto queries draaien, en biedt ook beheerde Zeppelin notebooks die ik graag gebruik. Met Qubole hoef ik niet veel na te denken over het configureren en afstemmen van Spark en Zeppelin, het is gewoon afgehandeld voor mij.
de werkelijke use case die ik heb is zeer eenvoudig:
- een soort telemetrie is geschreven aan Kafka: kleine JSON-berichten met metadata en willekeurige sleutel/waardeparen
- Ik wil verbinding maken met Kafka, deze berichten verbruiken en deserialiseren
- en indien nodig transformaties toepassen
- Verzamel enkele aggregaties
- tenslotte ben ik geïnteresseerd in afwijkingen en over het algemeen slechte gegevens — omdat ik de producent niet Beheer, wil ik dingen vangen zoals NULLs, lege strings, misschien onjuiste datums en andere waarden met specifieke formaten, enz.
- de taak moet enige tijd draaien en dan automatisch beëindigen. Meestal worden Spark Streaming-taken continu uitgevoerd, maar soms is het handig om het ad hoc uit te voeren voor analyse/debugging (of als voorbeeld in mijn geval, omdat het zo gemakkelijk is om een Spark-taak 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 Streaming te combineren met dataframes API om het beste van beide werelden te krijgen!
conclusie
welke aanpak is beter? Aangezien DStream slechts een verzameling van RDDs is, wordt het meestal gebruikt voor low-level transformaties en verwerking. Het toevoegen van een dataframes API op de top van dat levert zeer krachtige abstracties zoals SQL, maar vereist een beetje meer configuratie. En als je een eenvoudige use case, Spark gestructureerde Streaming misschien een betere oplossing in het algemeen!