Articles

Inleiding tot Apache Spark met voorbeelden en Use Cases

Ik hoorde voor het eerst van Spark eind 2013 toen ik geïnteresseerd raakte in Scala, de taal waarin Spark is geschreven. Enige tijd later deed ik een leuk data science project om de overleving op de Titanic te voorspellen. Dit bleek een geweldige manier om verder kennis te maken met Spark concepten en programmering. Ik beveel het voor elke aspirant Spark ontwikkelaars op zoek naar een plek om te beginnen.

vandaag wordt Spark overgenomen door grote spelers zoals Amazon, eBay en Yahoo! Veel organisaties draaien Vonk op clusters met duizenden knooppunten. Volgens de Spark FAQ, de grootste bekende cluster heeft meer dan 8000 knooppunten. Inderdaad, Spark is een technologie die de moeite waard nota te nemen van en te leren over.

Dit artikel geeft een inleiding tot Spark inclusief use cases en voorbeelden. Het bevat informatie van de Apache Spark website evenals de boek Leren Spark-bliksemsnelle Big Data-Analyse.

Wat is Apache Spark? Een inleiding

Spark is een Apache-project dat wordt geadverteerd als “lightning fast cluster computing”. Het heeft een bloeiende open-source gemeenschap en is het meest actieve Apache-project op dit moment.

Spark biedt een sneller en algemener platform voor gegevensverwerking. Spark kunt u programma ‘ s tot 100x sneller in het geheugen, of 10x sneller op de schijf, dan Hadoop. Vorig jaar, Spark nam Hadoop door het invullen van de 100 TB Daytona GraySort contest 3x sneller op een tiende van het aantal machines en het werd ook de snelste open source engine voor het sorteren van een petabyte.

Spark maakt het ook mogelijk om code sneller te schrijven omdat u meer dan 80 operators op hoog niveau tot uw beschikking hebt. Om dit te demonstreren, laten we eens een kijkje nemen op de ” Hello World!”of BigData: the Word Count example. Geschreven in Java voor MapReduce het heeft ongeveer 50 regels code, terwijl in Spark (en Scala) je het zo eenvoudig kunt doen:

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

een ander belangrijk aspect bij het leren hoe Apache Spark te gebruiken is de interactieve shell (REPL) die het out-of-the-box biedt. Met REPL, kan men het resultaat van elke regel code te testen ZONDER eerst te coderen en uitvoeren van de hele taak. De weg naar werkende code is dus veel korter en ad-hoc data-analyse wordt mogelijk gemaakt.

extra belangrijke eigenschappen van Spark zijn:

  • biedt momenteel API ‘ s in Scala, Java en Python, met ondersteuning voor andere talen (zoals R) onderweg integreert
  • goed met het Hadoop-ecosysteem en gegevensbronnen (HDFS, Amazon S3, Hive, HBase, Cassandra, enz.)
  • kan draaien op clusters die beheerd worden door Hadoop YARN of Apache Mesos, en kan ook standalone

draaien de Spark core wordt aangevuld met een set krachtige, hogere bibliotheken die naadloos gebruikt kunnen worden in dezelfde applicatie. Deze bibliotheken zijn momenteel SparkSQL, Spark Streaming, MLlib (voor machine learning), en GraphX, die elk verder wordt beschreven in dit artikel. Extra Spark bibliotheken en extensies zijn momenteel in ontwikkeling.

spark libraries and extensions

Spark Core

Spark Core is de basismotor voor grootschalige parallelle en gedistribueerde gegevensverwerking. Het is verantwoordelijk voor:

  • geheugenbeheer en foutherstel
  • het plannen, distribueren en bewaken van taken op een cluster
  • interactie met opslagsystemen

Spark introduceert het concept van een RDD (Resilient Distributed Dataset), een onveranderlijke fouttolerante, gedistribueerde verzameling objecten die parallel kunnen worden gebruikt. Een RDD kan elk type object bevatten en wordt gemaakt door een externe dataset te laden of een verzameling vanuit het stuurprogramma te distribueren.

POD ‘ s ondersteunen twee soorten operaties:

  • transformaties zijn bewerkingen (zoals map, filter, join, union, enzovoort) die worden uitgevoerd op een RDD en die een nieuwe RDD opleveren die het resultaat bevat.
  • acties zijn operaties (zoals reduce, count, first, enzovoort) die een waarde retourneren na het uitvoeren van een berekening op een RDD.

transformaties in Spark zijn “lui”, wat betekent dat ze hun resultaten niet meteen berekenen. In plaats daarvan “onthouden” ze alleen de operatie die moet worden uitgevoerd en de dataset (bijvoorbeeld het bestand) waarnaar de operatie moet worden uitgevoerd. De transformaties worden alleen daadwerkelijk berekend wanneer een actie wordt aangeroepen en het resultaat wordt teruggegeven aan het stuurprogramma. Dit ontwerp zorgt ervoor dat Spark efficiënter kan werken. Bijvoorbeeld, als een groot bestand op verschillende manieren werd getransformeerd en doorgegeven aan de eerste actie, zou Spark alleen het resultaat voor de eerste regel verwerken en retourneren, in plaats van het werk voor het hele bestand te doen.

standaard kan elke getransformeerde RDD opnieuw worden berekend elke keer dat u er een actie op uitvoert. Echter, kunt u ook een RDD in het geheugen met behulp van de persist of cache methode, in welk geval Spark zal de elementen rond te houden op het cluster voor veel snellere toegang de volgende keer dat u het query.

SparkSQL

SparkSQL is een Spark component die het opvragen van gegevens via SQL of via de Hive Query taal ondersteunt. Het is ontstaan als de Apache Hive port te draaien op de top van Spark (in plaats van MapReduce) en is nu geïntegreerd met de Spark stack. Naast het bieden van ondersteuning voor verschillende gegevensbronnen, het maakt het mogelijk om SQL query ‘ s weven met code transformaties die resulteert in een zeer krachtige tool. Hieronder is een voorbeeld van een Hive – compatibele query:

// 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 ondersteunt real-time verwerking van streaming gegevens, zoals productie webserver logbestanden (bijvoorbeeld Apache Flume en HDFS / S3), sociale media zoals Twitter, en verschillende messaging wachtrijen zoals Kafka. Onder de motorkap ontvangt Spark Streaming de invoerdatastromen en verdeelt de gegevens in batches. Volgende, ze worden verwerkt door de Vonkmotor en het genereren van de laatste stroom van de resultaten in batches, zoals hieronder afgebeeld.

spark streaming

De Spark Streaming API komt nauw overeen met die van de Spark Core, waardoor het voor programmeurs gemakkelijk is om te werken in de wereld van zowel batch-als streaming data.

MLlib

MLlib is een machine learning bibliotheek die verschillende algoritmen ontworpen om uit te schalen op een cluster voor classificatie, regressie, clustering, collaborative filtering, enzovoort (check out Toptal ‘ s artikel over machine learning voor meer informatie over dat onderwerp). Sommige van deze algoritmen werken ook met streaming data, zoals lineaire regressie met behulp van gewone kleinste kwadraten of K-middelen clustering (en meer op de weg). Apache Mahout (een machine learning bibliotheek voor Hadoop) heeft zich al afgekeerd van MapReduce en de krachten gebundeld op Spark MLlib.

GraphX

graphx

GraphX is een bibliotheek voor het manipuleren van grafieken en het uitvoeren van grafieken-parallelle bewerkingen. Het biedt een uniform hulpmiddel voor ETL, verkennende analyse en iteratieve grafiekberekeningen. Afgezien van ingebouwde bewerkingen voor Grafiek manipulatie, biedt het een bibliotheek van gemeenschappelijke grafiek algoritmen zoals PageRank.

Hoe gebruik ik Apache Spark: Event Detection Use Case

nu we de vraag hebben beantwoord ” Wat is Apache Spark?”, laten we denken aan wat voor soort problemen of uitdagingen het meest effectief kan worden gebruikt.

Ik kwam onlangs een artikel tegen over een experiment om een aardbeving te detecteren door een Twitter-stream te analyseren. Interessant is dat deze techniek je waarschijnlijk sneller zou informeren over een aardbeving in Japan dan het Japan Meteorological Agency. Ook al gebruikten ze verschillende technologie in hun artikel, Ik denk dat het een geweldig voorbeeld is om te zien hoe we Spark konden gebruiken met vereenvoudigde code fragmenten en zonder de lijm code.

eerst moeten we tweets filteren die relevant lijken, zoals “aardbeving” of “schudden”. Daarvoor kunnen we eenvoudig Spark Streaming als volgt gebruiken:

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

dan moeten we een semantische analyse uitvoeren op de tweets om te bepalen of ze lijken te verwijzen naar een huidige aardbeving. Tweets als ” aardbeving!”of” Nu is het schudden”, bijvoorbeeld, zou worden beschouwd als positieve wedstrijden, terwijl tweets als “het bijwonen van een aardbeving conferentie” of “de aardbeving gisteren was eng” zou niet. De auteurs van het artikel gebruikten hiervoor een support vector machine (SVM). We doen hier hetzelfde, maar kunnen ook een streaming versie proberen. Een resulterend code voorbeeld van MLlib zou er als volgt uitzien:

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

als we tevreden zijn met de voorspellingssnelheid van het model, kunnen we naar de volgende fase gaan en reageren wanneer we een aardbeving ontdekken. Om er een te detecteren hebben we een bepaald aantal (densiteit) positieve tweets nodig in een bepaald tijdvenster (zoals beschreven in het artikel). Voor tweets met Twitter-locatieservices die zijn ingeschakeld, zouden we ook de locatie van de aardbeving extraheren. Gewapend met deze kennis, kunnen we SparkSQL gebruiken en een bestaande Bijenkorf tabel opvragen (gebruikers opslaan die geïnteresseerd zijn in het ontvangen van aardbevingsmeldingen) om hun e-mailadressen op te halen en hen een gepersonaliseerde waarschuwingsmail te sturen, als volgt:

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

andere Apache Spark Use Cases

potentiële use cases voor Spark reiken veel verder dan detectie van aardbevingen natuurlijk.

Hier is een snelle (maar zeker niet in de buurt uitputtend!) sampling van andere use cases die moeten omgaan met de snelheid, verscheidenheid en volume van Big Data, waarvoor Spark zo goed geschikt is:

in de game-industrie is het verwerken en ontdekken van patronen uit de potentiële Brandblusser van real-time in-game events en in staat zijn om er onmiddellijk op te reageren een mogelijkheid die een lucratieve business kan opleveren, voor doeleinden zoals het vasthouden van spelers, gerichte reclame, automatische aanpassing van het complexiteitsniveau, enzovoort.

in de e-commerce industrie kan real-time transactie informatie worden doorgegeven aan een streaming clustering algoritme zoals k-means of collaborative filtering zoals ALS. Resultaten kunnen dan zelfs worden gecombineerd met andere ongestructureerde gegevensbronnen, zoals opmerkingen van klanten of productbeoordelingen, en worden gebruikt om aanbevelingen voortdurend te verbeteren en aan te passen aan nieuwe trends.

in de financiële of beveiligingssector kan de Spark stack worden toegepast op een fraude-of inbraakdetectiesysteem of op risicogebaseerde authenticatie. Het kan eersteklas resultaten bereiken door enorme hoeveelheden gearchiveerde logs te oogsten, te combineren met externe gegevensbronnen zoals informatie over datalekken en gecompromitteerde accounts (zie bijvoorbeeld https://haveibeenpwned.com/) en informatie uit de verbinding/aanvraag zoals IP-geolocatie of tijd.

conclusie

samenvattend helpt Spark de uitdagende en rekenintensieve taak van het verwerken van grote hoeveelheden real-time of gearchiveerde gegevens, zowel gestructureerd als ongestructureerd, te vereenvoudigen, waarbij relevante complexe mogelijkheden zoals machine learning en grafiekalgoritmen naadloos worden geïntegreerd. Spark brengt Big data verwerking naar de massa. Kijk eens!