Inleiding tot Apache Spark

1. Inleiding

Apache Spark is een open-source framework voor clustercomputing. Het biedt elegante ontwikkel-API's voor Scala, Java, Python en R waarmee ontwikkelaars een verscheidenheid aan gegevensintensieve workloads kunnen uitvoeren over verschillende gegevensbronnen, waaronder HDFS, Cassandra, HBase, S3 enz.

Historisch gezien bleek MapReduce van Hadoop inefficiënt te zijn voor sommige iteratieve en interactieve computeropdrachten, wat uiteindelijk leidde tot de ontwikkeling van Spark. Met Spark kunnen we logica tot twee ordes van grootte sneller uitvoeren dan met Hadoop in het geheugen, of een orde van grootte sneller op schijf.

2. Spark-architectuur

Spark-applicaties worden uitgevoerd als onafhankelijke sets processen op een cluster, zoals beschreven in het onderstaande diagram:

Deze reeks processen wordt gecoördineerd door het SparkContext object in uw hoofdprogramma (het driverprogramma genoemd). SparkContext maakt verbinding met verschillende soorten clustermanagers (ofwel Spark's eigen zelfstandige clustermanager, Mesos of YARN), die bronnen over applicaties toewijzen.

Eenmaal verbonden, verwerft Spark uitvoerders op knooppunten in het cluster, dit zijn processen die berekeningen uitvoeren en gegevens opslaan voor uw toepassing.

Vervolgens verzendt het uw applicatiecode (gedefinieerd door JAR- of Python-bestanden die zijn doorgegeven aan SparkContext) aan de uitvoerders. Tenslotte, SparkContext stuurt taken naar de uitvoerders om uit te voeren.

3. Kerncomponenten

Het volgende diagram geeft een duidelijk beeld van de verschillende componenten van Spark:

3.1. Vonk kern

De Spark Core-component is verantwoordelijk voor alle basis I / O-functionaliteiten, het plannen en bewaken van de taken op spark-clusters, het verzenden van taken, netwerken met verschillende opslagsystemen, foutherstel en efficiënt geheugenbeheer.

In tegenstelling tot Hadoop vermijdt Spark dat gedeelde gegevens worden opgeslagen in tussenliggende winkels zoals Amazon S3 of HDFS door een speciale gegevensstructuur te gebruiken die bekend staat als RDD (Resilient Distributed Datasets).

Veerkrachtige gedistribueerde datasets zijn onveranderlijk, een gepartitioneerde verzameling records die - parallel en mogelijk maakt - fouttolerante ‘in-memory’ berekeningen.

RDD's ondersteunen twee soorten bewerkingen:

  • Transformatie - Spark RDD-transformatie is een functie die nieuwe RDD produceert op basis van de bestaande RDD's. De transformator neemt RDD als input en produceert een of meer RDD als output. Transformaties zijn lui van aard, d.w.z. ze worden uitgevoerd wanneer we een actie oproepen
  • Actietransformaties creëren RDD's van elkaar, maar wanneer we met de feitelijke dataset willen werken, wordt op dat moment actie ondernomen. Dus, Acties zijn Spark RDD-bewerkingen die niet-RDD-waarden geven. De actiewaarden worden opgeslagen in stuurprogramma's of op het externe opslagsysteem

Een actie is een van de manieren om gegevens van Executor naar de bestuurder te verzenden.

Uitvoerders zijn agenten die verantwoordelijk zijn voor het uitvoeren van een taak. Terwijl de bestuurder een JVM-proces is dat werknemers en de uitvoering van de taak coördineert. Sommige acties van Spark zijn tellen en verzamelen.

3.2. Spark SQL

Spark SQL is een Spark-module voor gestructureerde gegevensverwerking. Het wordt voornamelijk gebruikt om SQL-query's uit te voeren. Dataframe vormt de belangrijkste abstractie voor Spark SQL. Een gedistribueerde verzameling van gegevens geordend in benoemde kolommen staat bekend als een Dataframe in Spark.

Spark SQL ondersteunt het ophalen van gegevens uit verschillende bronnen, zoals Hive, Avro, Parquet, ORC, JSON en JDBC. Het schaalt ook naar duizenden knooppunten en query's van meerdere uren met behulp van de Spark-engine, die volledige fouttolerantie voor mid-queries biedt.

3.3. Spark-streaming

Spark Streaming is een uitbreiding van de kern-API van Spark die schaalbare, fouttolerante stroomverwerking met hoge doorvoer van live gegevensstromen mogelijk maakt. Gegevens kunnen worden opgenomen uit een aantal bronnen, zoals Kafka, Flume, Kinesis of TCP-sockets.

Ten slotte kunnen verwerkte gegevens worden gepusht naar bestandssystemen, databases en live dashboards.

3.4. Spark Mlib

MLlib is de machine learning (ML) -bibliotheek van Spark. Het doel is om praktisch machine learning schaalbaar en gemakkelijk te maken. Op hoog niveau biedt het tools zoals:

  • ML-algoritmen - veelgebruikte leeralgoritmen zoals classificatie, regressie, clustering en gezamenlijke filtering
  • Feature-extractie, transformatie, dimensionaliteitsreductie en selectie
  • Pijplijnen - tools voor het construeren, evalueren en afstemmen van ML-pijplijnen
  • Persistentie - algoritmen, modellen en pijplijnen opslaan en laden
  • Hulpprogramma's - lineaire algebra, statistieken, gegevensverwerking, enz.

3.5. Spark GraphX

GraphX ​​is een component voor grafieken en grafiekparallelle berekeningen. Op een hoog niveau breidt GraphX ​​de Spark RDD uit door een nieuwe Graph-abstractie te introduceren: een gerichte multigraph met eigenschappen die aan elk hoekpunt en elke rand zijn bevestigd.

Om de berekening van grafieken te ondersteunen, legt GraphX ​​een reeks fundamentele operatoren bloot (bijv. subgraaf, joinVertices, en aggregateMessages).

Bovendien bevat GraphX ​​een groeiende verzameling grafiekalgoritmen en bouwers om grafiekanalysetaken te vereenvoudigen.

4. "Hallo wereld" in Spark

Nu we de kerncomponenten begrijpen, kunnen we doorgaan naar een eenvoudig Maven-gebaseerd Spark-project - voor het berekenen van het aantal woorden.

We demonstreren dat Spark in de lokale modus draait, waarbij alle componenten lokaal op dezelfde machine worden uitgevoerd als het hoofdknooppunt, de uitvoerende knooppunten of de zelfstandige clustermanager van Spark.

4.1. Maven instellen

Laten we een Java Maven-project opzetten met Spark-gerelateerde afhankelijkheden in pom.xml het dossier:

  org.apache.spark spark-core_2.10 1.6.0 

4.2. Word Count - Spark Job

Laten we nu een Spark-taak schrijven om een ​​bestand met zinnen te verwerken en verschillende woorden en hun tellingen in het bestand uit te voeren:

public static void main (String [] args) gooit uitzondering {if (args.length <1) {System.err.println ("Usage: JavaWordCount"); System.exit (1); } SparkConf sparkConf = nieuwe SparkConf (). SetAppName ("JavaWordCount"); JavaSparkContext ctx = nieuwe JavaSparkContext (sparkConf); JavaRDD-regels = ctx.textFile (args [0], 1); JavaRDD-woorden = lines.flatMap (s -> Arrays.asList (SPACE.split (s)). Iterator ()); JavaPairRDD ones = words.mapToPair (word -> new Tuple2 (word, 1)); JavaPairRDD counts = ones.reduceByKey ((Geheel getal i1, Geheel getal i2) -> i1 + i2); Lijst output = counts.collect (); voor (Tuple2 tuple: output) {System.out.println (tuple._1 () + ":" + tuple._2 ()); } ctx.stop (); }

Merk op dat we het pad van het lokale tekstbestand doorgeven als een argument voor een Spark-taak.

EEN SparkContext object is het belangrijkste toegangspunt voor Spark en vertegenwoordigt de verbinding met een reeds actief Spark-cluster. Het gebruikt SparkConf object voor het beschrijven van de applicatieconfiguratie. SparkContext wordt gebruikt om een ​​tekstbestand in het geheugen te lezen als een JavaRDD voorwerp.

Vervolgens transformeren we de lijnen JavaRDD bezwaar maken tegen woorden JavaRDD object met behulp van de flatmap methode om eerst elke regel om te zetten in door spaties gescheiden woorden en vervolgens de uitvoer van elke regelverwerking af te vlakken.

We passen opnieuw de transformatie-operatie toe mapToPair die in feite elk voorkomen van het woord toewijst aan het tupel van woorden en het aantal van 1.

Vervolgens passen we de reduceByKey bewerking om meerdere exemplaren van een woord met tel 1 te groeperen tot een tupel van woorden en de telling samen te vatten.

Ten slotte voeren we c uitollect RDD-actie om de definitieve resultaten te krijgen.

4.3. Uitvoeren - Spark Job

Laten we nu het project bouwen met Maven om apache-spark-1.0-SNAPSHOT.jar in de doelmap.

Vervolgens moeten we deze WordCount-taak naar Spark verzenden:

$ {spark-install-dir} / bin / spark-submit --class com.baeldung.WordCount --master lokaal $ {WordCount-MavenProject} /target/apache-spark-1.0-SNAPSHOT.jar $ {WordCount-MavenProject} /src/main/resources/spark_example.txt

Spark-installatiemap en WordCount Maven-projectmap moeten worden bijgewerkt voordat bovenstaande opdracht wordt uitgevoerd.

Bij indiening gebeuren er een paar stappen achter de schermen:

  1. Van de bestuurderscode, SparkContext maakt verbinding met clustermanager (in ons geval vonk zelfstandige clustermanager lokaal)
  2. Cluster Manager wijst resources toe aan de andere applicaties
  3. Spark verwerft uitvoerders op knooppunten in het cluster. Hier krijgt onze applicatie voor het tellen van woorden zijn eigen executor-processen
  4. Toepassingscode (jar-bestanden) wordt naar uitvoerders gestuurd
  5. Taken worden verzonden door de SparkContext aan de executeurs.

Ten slotte wordt het resultaat van de spark-taak teruggestuurd naar de bestuurder en zullen we het aantal woorden in het bestand als uitvoer zien:

Hallo 1 van 2 Baledung 2 Keep 1 Learning 1 Spark 1 Bye 1

5. Conclusie

In dit artikel hebben we de architectuur en verschillende componenten van Apache Spark besproken. We hebben ook een werkend voorbeeld gedemonstreerd van een Spark-taak met het aantal woorden uit een bestand.

Zoals altijd is de volledige broncode beschikbaar op GitHub.