Articles

Introduktion til Apache Spark med eksempler og brugssager

Jeg hørte først om Spark i slutningen af 2013, da jeg blev interesseret i Scala, det sprog, som Spark er skrevet på. Nogen tid senere lavede jeg et sjovt datavidenskabsprojekt, der forsøgte at forudsige overlevelse på Titanic. Dette viste sig at være en fantastisk måde at blive yderligere introduceret til Spark-koncepter og programmering. Jeg kan varmt anbefale det til alle håbefulde Spark-udviklere, der leder efter et sted at komme i gang.

i dag bliver Spark vedtaget af store spillere som , eBay og Yahoo! Mange organisationer kører gnist på klynger med tusindvis af noder. Ifølge Ofte Stillede Spørgsmål om Spark har den største kendte klynge over 8000 noder. Ja, Spark er en teknologi, der er værd at notere sig og lære om.

denne artikel indeholder en introduktion til Spark, herunder brugssager og eksempler. Den indeholder oplysninger fra Apache Spark hjemmeside samt bogen Learning Spark – lynhurtig Big Data Analyse.

Hvad er Apache Spark? En introduktion

Spark er et Apache-projekt, der annonceres som”lightning fast cluster computing”. Det har et Blomstrende open source-samfund og er det mest aktive Apache-projekt i øjeblikket.Spark giver en hurtigere og mere generel databehandlingsplatform. Spark giver dig mulighed for at køre programmer op til 100 gange hurtigere i hukommelsen eller 10 gange hurtigere på disken end Hadoop. Sidste år overtog Spark Hadoop ved at gennemføre 100 TB Daytona GraySort-konkurrencen 3 gange hurtigere på en tiendedel af antallet af maskiner, og det blev også den hurtigste open source-motor til sortering af en petabyte.Spark gør det også muligt at skrive kode hurtigere, da du har over 80 operatører på højt niveau til din rådighed. For at demonstrere dette, lad os se på “Hej Verden!”af BigData: ordet tæller eksempel. Skrevet i Java til MapReduce har den omkring 50 linjer kode, mens du i Spark (og Scala) kan gøre det så simpelt som dette:

sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")

et andet vigtigt aspekt, når du lærer at bruge Apache Spark, er den interaktive shell (REPL), som den giver uden for boksen. Ved hjælp af REPL kan man teste resultatet af hver kodelinje uden først at skulle kode og udføre hele jobbet. Vejen til arbejdskode er således meget kortere, og ad hoc-dataanalyse er muliggjort.

yderligere nøglefunktioner i Spark inkluderer:

  • leverer i øjeblikket API ‘ er i Scala, Java og Python, med understøttelse af andre sprog (såsom R) undervejs
  • integreres godt med Hadoop-økosystemet og datakilderne (HDFS, S3, Hive, HBase, Cassandra osv.)
  • kan køre på klynger, der administreres af Hadoop YARN eller Apache Mesos, og kan også køre standalone

Spark core suppleres med et sæt kraftfulde biblioteker på højere niveau, som problemfrit kan bruges i samme applikation. Disse biblioteker omfatter i øjeblikket Gniststrømning, Mllib (til maskinindlæring) og Graphks, som hver især er nærmere beskrevet i denne artikel. Yderligere Gnistbiblioteker og udvidelser er i øjeblikket også under udvikling.

spark biblioteker og udvidelser

Spark Core er basismotoren til storskala parallel og distribueret databehandling. Det er ansvarligt for:

  • hukommelsesstyring og fejlgendannelse
  • planlægning, distribution og overvågning af job på en klynge
  • interaktion med lagringssystemer

Spark introducerer konceptet med et RDD (Resilient Distributed Dataset), en uforanderlig fejltolerant, distribueret samling af objekter, der kan betjenes parallelt. En RDD kan indeholde enhver type objekt og oprettes ved at indlæse et eksternt datasæt eller distribuere en samling fra driverprogrammet.

rdds understøtter to typer operationer:

  • transformationer er operationer (såsom kort, filter, join, union osv.), der udføres på en RDD, og som giver en ny RDD, der indeholder resultatet.
  • handlinger er operationer (såsom reducere, tælle, først osv.), der returnerer en værdi efter at have kørt en beregning på en RDD.transformationer i Spark er “dovne”, hvilket betyder, at de ikke beregner deres resultater med det samme. I stedet “husker” de bare den operation, der skal udføres, og datasættet (f.eks. Transformationerne beregnes kun faktisk, når en handling kaldes, og resultatet returneres til driverprogrammet. Dette design gør det muligt for Spark at køre mere effektivt. For eksempel, hvis en stor fil blev transformeret på forskellige måder og overført til første handling, ville Spark kun behandle og returnere resultatet for den første linje i stedet for at udføre arbejdet for hele filen.

    som standard kan hver transformeret RDD beregnes igen, hver gang du kører en handling på den. Du kan dog også fortsætte en RDD i hukommelsen ved hjælp af vedvarende eller cache-metoden, i hvilket tilfælde Spark vil holde elementerne rundt på klyngen for meget hurtigere adgang, næste gang du spørger det.

    Sparkskl

    Sparkskl er en Gnistkomponent, der understøtter forespørgselsdata enten via Hive-Forespørgselssproget. Det opstod som Apache Hive port til at køre oven på Spark (i stedet for MapReduce) og er nu integreret med Spark stack. Ud over at yde støtte til forskellige datakilder gør det det muligt at væve forespørgsler med kodetransformationer, hvilket resulterer i et meget kraftfuldt værktøj. Nedenfor er et eksempel på en Hive-kompatibel forespørgsel:

    // sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")// Queries are expressed in HiveQLsqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

    Spark Streaming understøtter realtidsbehandling af streamingdata, f.eks. Under hætten modtager Spark Streaming inputdatastrømmene og deler dataene i batches. Næste, de bliver behandlet af Gnistmotoren og genererer den endelige strøm af resultater i batches, som afbildet nedenfor.

    spark streaming

    Spark Streaming API passer tæt sammen med Spark Core, hvilket gør det nemt for programmører at arbejde i verdener af både batch og streaming data.

    MLlib

    MLlib er et maskinlæringsbibliotek, der giver forskellige algoritmer designet til at skalere ud på en klynge til klassificering, regression, klyngedannelse, samarbejdsfiltrering og så videre (tjek Toptal ‘ s artikel om maskinindlæring for mere information om dette emne). Nogle af disse algoritmer fungerer også med streamingdata, såsom lineær regression ved hjælp af almindelige mindste firkanter eller K-betyder klyngedannelse (og mere på vej). Apache Mahout (et maskinlæringsbibliotek for Hadoop) har allerede vendt sig væk fra MapReduce og slået sig sammen om Spark MLlib.

    graf

    graf

    Graf er et bibliotek til manipulation af grafer og udførelse af graf-parallelle operationer. Det giver et ensartet værktøj til ETL, sonderende analyse og iterative grafberegninger. Bortset fra indbyggede operationer til grafmanipulation giver det et bibliotek med almindelige grafalgoritmer såsom PageRank.

    Sådan bruges Apache Spark: Hændelsesdetektering brug Case

    nu hvor vi har besvaret spørgsmålet ” Hvad er Apache Spark?”, lad os tænke på, hvilken slags problemer eller udfordringer det kunne bruges til mest effektivt.

    Jeg stødte på en artikel for nylig om et eksperiment for at opdage et jordskælv ved at analysere en kvidre strøm. Interessant nok blev det vist, at denne teknik sandsynligvis ville informere dig om et jordskælv i Japan hurtigere end det japanske Meteorologiske Agentur. Selvom de brugte anden teknologi i deres artikel, synes jeg det er et godt eksempel at se, hvordan vi kunne bruge Spark til brug med Forenklede kodestykker og uden limkoden.

    først skal vi filtrere kvidre, der synes relevante som “jordskælv” eller “ryster”. Vi kunne nemt bruge Spark Streaming til dette formål som følger:

    TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))

    derefter skulle vi køre en semantisk analyse på kvidrene for at afgøre, om de ser ud til at henvise til en nuværende jordskælvshændelse. Som ” jordskælv!”eller “nu ryster det”, for eksempel, ville overveje positive kampe, mens kvidre som “at deltage i en Jordskælvskonference” eller “jordskælvet i går var skræmmende” ikke ville. Forfatterne af papiret brugte en supportvektormaskine (SVM) til dette formål. Vi gør det samme her, men kan også prøve en streamingversion. Et resulterende kodeeksempel fra MLlib ville se ud som følgende:

    // We would prepare some earthquake tweet data and load it in LIBSVM format.val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt")// Split data into training (60%) and test (40%).val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)val training = splits(0).cache()val test = splits(1)// Run training algorithm to build the modelval numIterations = 100val model = SVMWithSGD.train(training, numIterations)// Clear the default threshold.model.clearThreshold()// Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label)}// Get evaluation metrics.val metrics = new BinaryClassificationMetrics(scoreAndLabels)val auROC = metrics.areaUnderROC()println("Area under ROC = " + auROC)

    Hvis vi er tilfredse med forudsigelseshastigheden for modellen, kunne vi gå videre til næste trin og reagere, når vi opdager et jordskælv. For at opdage en har vi brug for et bestemt antal (dvs.tæthed) af positive kvidre i et defineret tidsvindue (som beskrevet i artiklen). Bemærk, at for kvidre med kvidre placering tjenester aktiveret, ville vi også udtrække placeringen af jordskælvet. Bevæbnet med denne viden, kunne vi bruge og forespørge en eksisterende Hive tabel (lagring brugere interesseret i at modtage jordskælv meddelelser) for at hente deres e-mail-adresser og sende dem en personlig advarsel email, som følger:

    // sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)// sendEmail is a custom functionsqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)

    andre Apache Spark Use Cases

    potentielle use cases for Spark strækker sig langt ud over påvisning af jordskælv selvfølgelig.

    Her er en hurtig (men bestemt ikke nær udtømmende!) prøveudtagning af andre brugssager, der kræver håndtering af hastighed, variation og volumen af Big Data, som Spark er så velegnet til:

    i spilbranchen, behandling og opdagelse af mønstre fra den potentielle brandslange af realtids-begivenheder i spillet og at kunne reagere på dem med det samme er en evne, der kan give en lukrativ forretning til formål som spilleropbevaring, målrettet reklame, automatisk justering af kompleksitetsniveau osv.

    i e-handelsbranchen kunne transaktionsoplysninger i realtid overføres til en streamingklyngealgoritme som k-midler eller samarbejdsfiltrering som ALS. Resultaterne kan så endda kombineres med andre ustrukturerede datakilder, såsom kundekommentarer eller produktanmeldelser, og bruges til konstant at forbedre og tilpasse anbefalinger over tid med nye tendenser.

    i finans-eller sikkerhedsbranchen kan Spark stack anvendes til et system til afsløring af svig eller indtrængen eller risikobaseret godkendelse. Det kunne opnå førsteklasses resultater ved at høste enorme mængder arkiverede logfiler, kombinere det med eksterne datakilder som information om databrud og kompromitterede konti (se for eksempel https://haveibeenpwned.com/) og oplysninger fra forbindelsen/anmodningen, såsom IP geolocation eller tid.

    konklusion

    for at opsummere hjælper Spark med at forenkle den udfordrende og beregningsintensive opgave med at behandle store mængder realtids-eller arkiverede data, både strukturerede og ustrukturerede, problemfrit integrere relevante komplekse kapaciteter såsom maskinindlæring og grafalgoritmer. Spark bringer stor databehandling til masserne. Tjek det ud!