Articles

introduktion till Apache Spark med exempel och användningsfall

Jag hörde först om Spark i slutet av 2013 när jag blev intresserad av Scala, språket där Spark är skrivet. Någon gång senare gjorde jag ett roligt datavetenskapsprojekt som försökte förutsäga överlevnad på Titanic. Detta visade sig vara ett bra sätt att få ytterligare introduceras till Spark koncept och programmering. Jag rekommenderar det starkt för alla blivande Spark-utvecklare som letar efter en plats att komma igång.

idag antas Spark av stora aktörer som Amazon, eBay och Yahoo! Många organisationer kör Spark på kluster med tusentals noder. Enligt Spark FAQ har det största kända klustret över 8000 noder. Spark är verkligen en teknik som är väl värt att notera och lära sig om.

denna artikel ger en introduktion till Spark inklusive användningsfall och exempel. Den innehåller information från Apache Spark – webbplatsen samt boken Learning Spark-Lightning-Fast Big Data Analysis.

Vad är Apache Spark? En introduktion

Spark är ett Apache-projekt som annonseras som”lightning fast cluster computing”. Den har en blomstrande öppen källkod och är det mest aktiva Apache-projektet just nu.

Spark ger en snabbare och mer allmän databehandlingsplattform. Spark låter dig köra program upp till 100x snabbare i minnet, eller 10x snabbare på disken, än Hadoop. Förra året tog Spark över Hadoop genom att slutföra 100 TB Daytona GraySort contest 3x snabbare på en tiondel av antalet maskiner och det blev också den snabbaste Open source-motorn för att sortera en petabyte.

Spark gör det också möjligt att skriva kod snabbare eftersom du har över 80 högnivåoperatörer till ditt förfogande. För att visa detta, låt oss ta en titt på ”Hej världen!”av BigData: ordet räkna exempel. Skrivet i Java för MapReduce har det cirka 50 rader kod, medan i Spark (och Scala) kan du göra det så enkelt som det här:

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

en annan viktig aspekt när du lär dig hur du använder Apache Spark är det interaktiva skalet (REPL) som det ger Out-of-the box. Med REPL kan man testa resultatet av varje kodrad utan att först behöva koda och utföra hela jobbet. Vägen till arbetskod är således mycket kortare och ad hoc-dataanalys möjliggörs.

ytterligare viktiga funktioner i Spark inkluderar:

  • tillhandahåller för närvarande API: er i Scala, Java och Python, med stöd för andra språk (som R) på vägen
  • integreras bra med Hadoop-ekosystemet och datakällorna (HDFS, Amazon S3, Hive, HBase, Cassandra, etc.)
  • kan köras på kluster som hanteras av Hadoop garn eller Apache Mesos, och kan också köra fristående

Gnistkärnan kompletteras med en uppsättning kraftfulla bibliotek på högre nivå som kan användas sömlöst i samma applikation. Dessa bibliotek inkluderar för närvarande SparkSQL, Spark Streaming, MLlib (för maskininlärning) och GraphX, som var och en beskrivs mer detaljerat i den här artikeln. Ytterligare Spark bibliotek och tillägg är för närvarande under utveckling samt.

spark bibliotek och tillägg

Spark Core

Spark Core är basmotorn för storskalig parallell och distribuerad databehandling. Den ansvarar för:

  • minneshantering och felåterställning
  • schemaläggning, distribution och övervakning av jobb på ett kluster
  • interagera med lagringssystem

Spark introducerar begreppet RDD (Resilient Distributed Dataset), en oföränderlig feltolerant, distribuerad samling av objekt som kan drivas parallellt. En RDD kan innehålla alla typer av objekt och skapas genom att ladda en extern dataset eller distribuera en samling från drivrutinsprogrammet.

RDDs stöder två typer av operationer:

  • transformationer är operationer (t.ex. map, filter, join, union och så vidare) som utförs på en RDD och som ger en ny RDD som innehåller resultatet.
  • åtgärder är operationer (till exempel minska, räkna, först och så vidare) som returnerar ett värde efter att ha kört en beräkning på en RDD.

transformationer i Spark är” lata”, vilket innebär att de inte beräknar sina resultat direkt. Istället ”kommer de bara ihåg” operationen som ska utföras och datasetet (t.ex. fil) till vilken operationen ska utföras. Transformationerna beräknas faktiskt bara när en åtgärd anropas och resultatet returneras till drivrutinsprogrammet. Denna design gör det möjligt för Spark att köra mer effektivt. Till exempel, om en stor fil omvandlades på olika sätt och skickades till första åtgärden, skulle Spark bara bearbeta och returnera resultatet för den första raden, snarare än att göra jobbet för hela filen.

som standard kan varje transformerad RDD beräknas om varje gång du kör en åtgärd på den. Du kan dock också kvarstå en RDD i minnet med hjälp av metoden persistent eller cache, i vilket fall Spark kommer att hålla elementen runt i klustret för mycket snabbare åtkomst nästa gång du frågar det.

SparkSQL

SparkSQL är en Gnistkomponent som stöder frågande data antingen via SQL eller via Hive-frågespråket. Den har sitt ursprung som Apache Hive port för att köras ovanpå Spark (i stället för MapReduce) och är nu integrerad med Spark stack. Förutom att ge stöd för olika datakällor gör det det möjligt att väva SQL-frågor med kodtransformationer vilket resulterar i ett mycket kraftfullt verktyg. Nedan är ett exempel på en Hive kompatibel fråga:

// 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

Spark Streaming stöder realtidsbehandling av strömmande data, såsom produktion webbserver loggfiler (t.ex. Apache Flume och HDFS/S3), sociala medier som Twitter, och olika meddelandeköer som Kafka. Under huven tar Spark Streaming emot indataströmmarna och delar upp data i satser. Därefter bearbetas de av Gnistmotorn och genererar slutlig ström av resultat i satser, som avbildas nedan.

spark streaming

Spark Streaming API matchar nära Spark Core, vilket gör det enkelt för programmerare att arbeta i världarna av både batch-och streamingdata.

MLlib

MLlib är ett maskininlärningsbibliotek som tillhandahåller olika algoritmer utformade för att skala ut på ett kluster för klassificering, regression, kluster, samarbetsfiltrering och så vidare (kolla in Toptals artikel om maskininlärning för mer information om det ämnet). Några av dessa algoritmer fungerar också med strömmande data, till exempel linjär regression med vanliga minsta kvadrater eller k-betyder kluster (och mer på vägen). Apache Mahout (ett maskininlärningsbibliotek för Hadoop) har redan vänt sig bort från MapReduce och gått samman på Spark MLlib.

GraphX

graphx

GraphX är ett bibliotek för att manipulera grafer och utföra graf-parallella operationer. Det ger ett enhetligt verktyg för ETL, utforskande analys och iterativa grafberäkningar. Förutom inbyggda operationer för grafmanipulation ger det ett bibliotek med vanliga grafalgoritmer som PageRank.

hur man använder Apache Spark: händelsedetektering användningsfall

Nu när vi har svarat på frågan ”Vad är Apache Spark?”, låt oss tänka på vilken typ av problem eller utmaningar det kan användas mest effektivt.

jag kom nyligen över en artikel om ett experiment för att upptäcka en jordbävning genom att analysera en Twitter-ström. Intressant visade det sig att denna teknik sannolikt skulle informera dig om en jordbävning i Japan snabbare än Japans meteorologiska byrå. Även om de använde olika tekniker i sin artikel tycker jag att det är ett bra exempel att se hur vi kunde använda Spark med förenklade kodavsnitt och utan limkoden.

först måste vi filtrera tweets som verkar relevanta som ”jordbävning” eller ”skakning”. Vi kan enkelt använda Spark Streaming för det ändamålet enligt följande:

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

då måste vi köra någon semantisk analys på tweets för att avgöra om de verkar referera till en aktuell jordbävningshändelse. Tweets som ” jordbävning!”eller ”Nu skakar det”, till exempel, skulle överväga positiva matcher, medan tweets som ”delta i en Jordbävningskonferens” eller ”jordbävningen igår var skrämmande” skulle inte. Författarna till papperet använde en stödvektormaskin (SVM) för detta ändamål. Vi gör detsamma här, men kan också prova en strömmande version. Ett resulterande kodexempel från MLlib skulle se ut som följande:

// 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)

Om vi är nöjda med modellens förutsägelsehastighet kan vi gå vidare till nästa steg och reagera när vi upptäcker en jordbävning. För att upptäcka en behöver vi ett visst antal (dvs densitet) positiva tweets i ett definierat tidsfönster (som beskrivs i artikeln). Observera att för tweets med Twitter-Platstjänster aktiverade skulle vi också extrahera jordbävningens plats. Beväpnad med denna kunskap kan vi använda SparkSQL och fråga en befintlig Hive-tabell (lagra användare som är intresserade av att ta emot jordbävningsanmälningar) för att hämta sina e-postadresser och skicka dem ett personligt varningsmeddelande, enligt följande:

// 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)

andra Apache Spark användningsfall

potentiella användningsfall för Spark sträcker sig långt bortom upptäckt av jordbävningar naturligtvis.

här är en snabb (men säkert ingenstans nära uttömmande!) provtagning av andra användningsfall som kräver att hantera hastigheten, variationen och volymen av stora Data, för vilka Spark är så väl lämpad:

i spelindustrin, bearbetning och upptäcka mönster från den potentiella brandhosen i realtid i spelhändelser och att kunna svara på dem omedelbart är en förmåga som kan ge en lukrativ verksamhet, för ändamål som spelarhållning, riktad reklam, automatisk justering av komplexitetsnivå och så vidare.

i e-handelsbranschen kan transaktionsinformation i realtid överföras till en streamingklusteringsalgoritm som k-means eller samarbetsfiltrering som ALS. Resultaten kan sedan till och med kombineras med andra ostrukturerade datakällor, till exempel Kundkommentarer eller produktrecensioner, och används för att ständigt förbättra och anpassa rekommendationer över tid med nya trender.

i finans-eller säkerhetsbranschen kan Spark-stacken tillämpas på ett system för bedrägeri eller intrångsdetektering eller riskbaserad autentisering. Det kan uppnå förstklassiga resultat genom att skörda enorma mängder arkiverade loggar, kombinera det med externa datakällor som information om dataintrång och komprometterade konton (Se till exempel https://haveibeenpwned.com/) och information från anslutningen/begäran som IP-geolokalisering eller tid.

slutsats

Sammanfattningsvis bidrar Spark till att förenkla den utmanande och beräkningsintensiva uppgiften att bearbeta stora volymer av realtids-eller arkiverade data, både strukturerade och ostrukturerade, sömlöst integrera relevanta komplexa funktioner som maskininlärning och grafalgoritmer. Spark ger stor databehandling till massorna. Kolla in det!