dette innlegget er en gjestepublikasjon skrevet Av Yaroslav Tkachenko, En Programvarearkitekt Hos Activision.
Apache Spark er en Av De mest populære og kraftige storskala databehandlingsrammer. Den ble opprettet som et alternativ Til Hadoops MapReduce-rammeverk for batcharbeidsbelastninger, men nå støtter DEN OGSÅ SQL, maskinlæring og strømbehandling. I dag vil jeg fokusere På Spark Streaming og vise noen alternativer tilgjengelig for strømbehandling.
Stream databehandling brukes når dynamiske data genereres kontinuerlig, og det er ofte funnet i big data brukstilfeller. I de fleste tilfeller behandles data i nær sanntid, en post om gangen, og innsiktene som er avledet fra dataene, brukes også til å gi varsler, gjengi instrumentbord og feed machine learning-modeller som kan reagere raskt på nye trender i dataene.
DStreams vs DataFrames
Gnist Streaming gikk alfa Med Gnist 0.7.0. Den er basert på ideen om diskretiserte strømmer eller DStreams. Hver DStream er representert som En Sekvens Av RDDs, så det er enkelt å bruke hvis du kommer fra lavt NIVÅ rdd-støttet batch arbeidsbelastninger. DStreams gjennomgikk mange forbedringer over den perioden, men det var fortsatt ulike utfordringer, først og fremst fordi DET ER ET VELDIG LAVT NIVÅ API.
Som en løsning på disse utfordringene ble Spark Structured Streaming introdusert I Spark 2.0 (og ble stabil i 2.2) som en utvidelse bygget på Toppen Av Spark SQL. På grunn av det, tar det nytte Av Spark SQL-kode og minne optimaliseringer. Strukturert Streaming gir også svært kraftige abstraksjoner som Datasett / DataFrame Apier samt SQL. Ikke mer å gjøre MED RDD direkte!
Både Strukturert Streaming og Streaming med DStreams bruker mikro-batching. Strukturert Streaming tilbyr nøyaktig en gang levering med 100 + millisekunder ventetid, mens Streaming Med DStreams tilnærming bare garanterer minst en gang levering, men kan gi millisekunder ventetider.
jeg personlig foretrekker Spark Strukturert Streaming for enkle brukssaker, men Spark Streaming med DStreams er veldig bra for mer kompliserte topologier på grunn av sin fleksibilitet. Derfor vil jeg vise hvordan Du bruker Streaming Med DStreams og Streaming Med DataFrames (som vanligvis brukes Med Spark Structured Streaming) for å konsumere Og behandle data Fra Apache Kafka. Jeg skal bruke Scala, Apache Spark 2.3 og Apache Kafka 2.0.
For eksempel vil Jeg også kjøre jobbene mine ved Hjelp Av Apache Zeppelin-notatbøker levert av Qubole. Qubole er en dataplattform som jeg bruker daglig. Den administrerer Hadoop og Spark klynger, gjør det enkelt å kjøre ad hoc Hive og Presto spørringer, og gir også klarte Zeppelin notatbøker som jeg gjerne bruker. Med Qubole trenger jeg ikke å tenke mye på å konfigurere Og tuning Spark og Zeppelin, det håndteres bare for meg.
den faktiske brukssaken jeg har er veldig grei:
- en slags telemetri er skrevet Til Kafka: små json — meldinger med metadata og vilkårlig nøkkel/verdipar
- jeg vil koble Til Kafka, forbruke og deserialisere disse meldingene
- bruk deretter transformasjoner om nødvendig
- Samle noen aggregeringer
- Til Slutt er jeg interessert i anomalier og generelt dårlige data-Siden jeg ikke kontrollerer produsenten, vil jeg fange Ting Som NULLs, tomme strenger, kanskje feil datoer og andre verdier med SPESIFIKKE FORMATER, etc.
- jobben skal kjøre en stund, og deretter avsluttes automatisk. Vanligvis Kjører Spark Streaming jobber kontinuerlig, men noen ganger kan det være nyttig å kjøre det ad hoc for analyse / feilsøking (eller som et eksempel i mitt tilfelle, siden det er så enkelt å kjøre En Spark jobb i en notatbok).
Streaming Med DStreams
i denne tilnærmingen bruker Vi DStreams, som bare er en samling Av RDDs.
Streaming Med DataFrames
nå kan Vi prøve å kombinere Streaming Med DataFrames API for å få det beste fra begge verdener!
Konklusjon
Hvilken tilnærming er bedre? Siden DStream bare er en samling Av RDDs, brukes den vanligvis til transformasjoner og prosessering på lavt nivå. Legge Til En DataFrames API på toppen av det gir svært kraftige abstraksjoner som SQL, men krever litt mer konfigurasjon. Og hvis Du har en enkel brukstilfelle, Spark Structured Streaming kan være en bedre løsning generelt!