Apache Spark DStream (Discretized Streams)
Håll dig uppdaterad om de senaste tekniktrenderna
Slut dig till DataFlair på Telegram!!
Objektiv
Denna Spark-handledning går igenom Apache Spark DStream. Först och främst kommer vi att se vad Spark Streaming är och sedan vad DStream är i Apache Spark. Discretized Stream Operations dvs. Stateless och Stateful Transformations, Output operation, Input DStream och Receivers diskuteras också i denna Apache Spark-blogg.
Apache Spark DStream (Discretized Streams)
Introduktion till DStream i Apache Spark
I det här avsnittet kommer vi att lära oss om DStream. Vad är dess roll och ansvar i Spark Streaming? Det inkluderar vilka metoder som är inskolade för att hantera live streaming av data.
Som en förlängning av Apache Spark API är Spark Streaming ett feltolerant system med hög genomströmning. Det behandlar den levande dataströmmen. Spark Streaming tar emot indata från olika tillförlitliga inmatningskällor som Flume, HDFS och Kafka etc. och skickar sedan de bearbetade uppgifterna till filsystem, databaser eller live dashboards. Den inkommande dataströmmen delas upp i datapartier och genererar sedan den slutliga dataströmmen med resultatet i partier.
Spark DStream (Discretized Stream) är den grundläggande abstraktionen av Spark Streaming. DStream är en kontinuerlig dataström. Den tar emot indata från olika källor som Kafka, Flume, Kinesis eller TCP-socklar. Det kan också vara en dataström som genereras genom att omvandla inmatningsströmmen. I sin kärna är DStream en kontinuerlig ström av RDD (Spark-abstraktion). Varje RDD i DStream innehåller data från ett visst intervall.
Alla operationer på en DStream gäller för alla underliggande RDD:er. DStream täcker alla detaljer. Det ger utvecklaren ett API på hög nivå för att underlätta. Som ett resultat underlättar Spark DStream arbetet med strömmande data.
Spark Streaming erbjuder feltoleransegenskaper för DStreams som för RDD:s. Så länge en kopia av indata är tillgänglig kan den räkna om vilket tillstånd som helst från den med hjälp av RDD:s härstamning. Som standard replikerar Spark data på två noder. Som ett resultat av detta kan Spark Streaming tåla fel på en enda arbetare.
Apache Spark DStream Operations
Likt RDD har Spark DStream också stöd för två typer av Operations: Transformeringar och utdataoperationer-
i. Transformation
Det finns två typer av transformationer i DStream:
- Stateless Transformations
- Stateful Transformations
a. Stateless Transformations
Behandlingen av varje batch är inte beroende av data från tidigare batcher. Stateless transformations är enkla RDD-transformationer. Den tillämpas på varje batch vilket innebär varje RDD i en DStream. Den omfattar vanliga RDD-transformationer som map(), filter(), reduceByKey() etc.
Och även om dessa funktioner verkar som om de tillämpas på hela strömmen är varje DStream en samling av många RDD:er (batcher). Som ett resultat av detta gäller varje stateless transformation för varje RDD.
Stateless transformationer kan kombinera data från många DStreams inom varje tidssteg. Till exempel har DStreams med nyckel/värde samma anslutningsrelaterade transformationer som RDDs – cogroup(), join(), leftOuterJoin() etc.
Vi kan använda dessa operationer på DStreams för att utföra underliggande RDD-operationer på varje batch.
Om stateless transformations inte räcker till har DStreams en avancerad operatör som heter transform(). transform() gör det möjligt att operera på RDDs inuti dem. Med transform() kan vilken godtycklig RDD-till-RDD-funktion som helst agera på DStream. Denna funktion anropas på varje datapost i strömmen för att producera en ny ström.
b. Stateful Transformations
Den använder data eller mellanliggande resultat från tidigare satser och beräknar resultatet av den aktuella satsen. Statsbundna transformationer är operationer på DStreams som spårar data över tiden. Den använder alltså vissa data från tidigare satser för att generera resultaten för en ny sats.
De två huvudtyperna är fönsteroperationer, som verkar över ett glidande fönster av tidsperioder, och updateStateByKey(), som används för att spåra tillståndet över händelser för varje nyckel (t.ex. för att bygga upp ett objekt som representerar varje användarsession).
Följ den här länken för att läsa DStreamtransformationer i detalj med exempel.
ii. Output Operation
När vi får data efter omvandlingen utförs output operation på dessa data i Spark Streaming. Efter felsökning av vårt program kan vi med hjälp av utdataoperationen endast spara vårt utdata. Några av utdataoperationerna är print(), save() osv. Save-operationen tar emot den katalog som filen ska sparas i och ett valfritt suffix. print() tar in de första 10 elementen från varje batch av DStream och skriver ut resultatet.
Input DStream och mottagare
Input DStream är en DStream som representerar strömmen av indata från en strömmande källa. Receiver (Scala doc, Java doc) objekt som är associerat med varje input DStream objekt. Det tar emot data från en källa och lagrar den i Spark-minnet för bearbetning.
Spark Streaming tillhandahåller två kategorier av inbyggda strömningskällor:
- Grundläggande källor – Dessa är Source som är direkt tillgängliga i StreamingContext API. Exempel: filsystem och socketanslutningar.
- Avancerade källor – Dessa källor är tillgängliga genom extra verktygsklasser som Kafka, Flume och Kinesis. Därför krävs länkning mot extra beroenden.
Till exempel:
- Kafka: Den artefakt som krävs för Kafka är spark-streaming-kafka-0-8_2.11.
- Flume: Artefakten som krävs för Flume är dspark-streaming-flume_2.11.
- Kinesis: Den artefakt som krävs för Kinesis är spark-streaming-kinesis-asl_2.11.
Den skapar många ingångar DStream för att ta emot flera dataströmmar parallellt. Den skapar flera mottagare som tar emot många dataströmmar. Spark worker/executor är en långvarig uppgift. Den upptar därför en av de kärnor som är kopplade till Spark Streaming-applikationen. Det är därför nödvändigt att Spark Streaming-applikationen har tillräckligt många kärnor för att bearbeta mottagna data.
Slutsats
Slutsatsen är att Spark Streaming, precis som RDD i Spark, tillhandahåller en abstraktion på hög nivå som kallas DStream. DStream representerar en kontinuerlig dataström. Internt porträtteras DStream som en sekvens av RDDs. Precis som RDD kan vi alltså få DStream från DStream-inmatning som Kafka, Flume etc. Dessutom kan omvandlingen tillämpas på den befintliga DStream för att få en ny DStream.