dette indlæg er en gæstepublikation skrevet af Yaroslav Tkachenko, en Programmelarkitekt hos Activision.
Apache Spark er en af de mest populære og kraftfulde store databehandlingsrammer. Det blev oprettet som et alternativ til Hadoops MapReduce-ramme for batcharbejdsbelastninger, men nu understøtter det også kvm, maskinindlæring og streambehandling. I dag vil jeg fokusere på Spark Streaming og vise et par muligheder til rådighed for stream behandling.
Stream databehandling bruges, når dynamiske data genereres kontinuerligt, og det findes ofte i Big data use cases. I de fleste tilfælde behandles data i næsten realtid, en post ad gangen, og den indsigt, der stammer fra dataene, bruges også til at give advarsler, gengive dashboards og fodre maskinlæringsmodeller, der hurtigt kan reagere på nye tendenser inden for dataene.
DStreams vs. DataFrames
Spark Streaming gik alfa med Spark 0.7.0. Det er baseret på ideen om diskretiserede vandløb eller DStreams. Hver DStream er repræsenteret som en sekvens af RDDs, så det er nemt at bruge, hvis du kommer fra lavt niveau RDD-backed batch arbejdsbyrder. DStreams gennemgik mange forbedringer i løbet af den periode, men der var stadig forskellige udfordringer, primært fordi det er et meget lavt niveau API.
som en løsning på disse udfordringer blev Spark Structured Streaming introduceret i Spark 2.0 (og blev stabil i 2.2) som en udvidelse bygget oven på Spark. På grund af det drager det fordel af Spark-kode-og hukommelsesoptimeringer. Struktureret Streaming giver også meget kraftige abstraktioner som datasæt / DataFrame API ‘ er samt kvm. Ikke mere beskæftiger sig med RDD direkte!
både struktureret Streaming og Streaming med DStreams bruger mikro-batching. Den største forskel er latenstid og meddelelsesleveringsgarantier: struktureret Streaming tilbyder nøjagtigt levering en gang med 100+ millisekunder latenstid, mens Streaming med DStreams-tilgang kun garanterer mindst en gang levering, men kan give millisekund latenstider.
jeg foretrækker personligt Spark struktureret Streaming til enkle brugssager, men Spark Streaming med DStreams er virkelig god til mere komplicerede topologier på grund af dens fleksibilitet. Derfor vil jeg nedenfor vise, hvordan man bruger Streaming med DStreams og Streaming med DataFrames (som typisk bruges med Spark Structured Streaming) til forbrug og behandling af data fra Apache Kafka. Jeg skal bruge Scala, Apache Spark 2.3 og Apache Kafka 2.0.
også for eksempel vil jeg køre mine job ved hjælp af Apache. Det er en platform, som jeg bruger dagligt. Det styrer Hadoop og Spark clusters, gør det nemt at køre ad hoc Hive og Presto forespørgsler, og giver også administrerede bærbare computere, som jeg med glæde bruger. Jeg har ikke brug for at tænke meget på at konfigurere og indstille Spark og Seppelin, det håndteres bare for mig.
den faktiske brugssag, jeg har, er meget ligetil:
- en slags telemetri er skrevet til Kafka: små JSON — meddelelser med metadata og vilkårlige nøgle/værdipar
- jeg vil oprette forbindelse til Kafka, forbruge og deserialisere disse meddelelser
- anvend derefter transformationer, hvis det er nødvendigt
- saml nogle aggregeringer
- endelig er jeg interesseret i anomalier og generelt dårlige data-da jeg ikke kontrollerer producenten, vil jeg fange ting som nuller, tomme strenge, måske forkerte datoer og andre værdier med specifikke formater osv.
- jobbet skal køre i nogen tid og derefter automatisk afslutte. Typisk kører Spark Streaming job kontinuerligt, men nogle gange kan det være nyttigt at køre det ad hoc til analyse/fejlfinding (eller som et eksempel i mit tilfælde, da det er så nemt at køre et Spark job i en notesbog).
Streaming med DStreams
i denne tilgang bruger vi DStreams, som simpelthen er en samling af RDDs.
Streaming med DataFrames
nu kan vi prøve at kombinere Streaming med DataFrames API for at få det bedste fra begge verdener!
konklusion
hvilken tilgang er bedre? Da DStream kun er en samling af RDDs, bruges den typisk til transformationer og behandling på lavt niveau. Tilføjelse af en DataFrames API oven på det giver meget kraftige abstraktioner som f.eks. Og hvis du har en simpel brugssag, kan Spark Structured Streaming muligvis være en bedre løsning generelt!