Introduktion til Apache Spark

1. Introduktion

Apache Spark er en open source cluster-computing-ramme. Det giver elegante udviklings-API'er til Scala, Java, Python og R, der giver udviklere mulighed for at udføre en række dataintensive arbejdsbelastninger på tværs af forskellige datakilder, herunder HDFS, Cassandra, HBase, S3 osv.

Historisk viste Hadoop's MapReduce sig at være ineffektiv for nogle iterative og interaktive computerjob, hvilket til sidst førte til udviklingen af ​​Spark. Med Spark kan vi køre logik op til to størrelsesordener hurtigere end med Hadoop i hukommelsen eller en størrelsesorden hurtigere på disken.

2. Gnistarkitektur

Spark-applikationer kører som uafhængige sæt processer i en klynge som beskrevet i nedenstående diagram:

Disse processer er koordineret af SparkContext objekt i dit hovedprogram (kaldet driverprogrammet). SparkContext opretter forbindelse til flere typer klyngemanagere (enten Sparks egen uafhængige klyngemanager, Mesos eller YARN), som fordeler ressourcer på tværs af applikationer.

Når forbindelsen er tilsluttet, erhverver Spark eksekutører på noder i klyngen, som er processer, der kører beregninger og gemmer data til din applikation.

Derefter sender den din applikationskode (defineret af JAR- eller Python-filer, der sendes til SparkContext) til eksekutorerne. Langt om længe, SparkContext sender opgaver til eksekutørerne til at køre.

3. Kernekomponenter

Følgende diagram giver et klart billede af de forskellige komponenter i Spark:

3.1. Gnistkerne

Spark Core-komponenten er ansvarlig for alle de grundlæggende I / O-funktioner, planlægning og overvågning af job på gnistklynger, opgaveforsendelse, netværk med forskellige lagringssystemer, fejlgendannelse og effektiv hukommelsesadministration.

I modsætning til Hadoop undgår Spark, at delte data lagres i mellemliggende butikker som Amazon S3 eller HDFS ved hjælp af en speciel datastruktur kendt som RDD (Resilient Distribuerede datasæt).

Resilient Distribuerede datasæt er uforanderlige, en opdelt samling af poster, der kan betjenes - parallelt og tillader - fejltolerante 'in-memory' beregninger.

RDD'er understøtter to slags operationer:

  • Transformation - Spark RDD transformation er en funktion, der producerer ny RDD fra de eksisterende RDD'er. Transformatoren tager RDD som input og producerer en eller flere RDD som output. Transformationer er dovne, dvs. de udføres, når vi kalder en handling
  • Handlingtransformationer skaber RDD'er fra hinanden, men når vi vil arbejde med det aktuelle datasæt, udføres der på det tidspunkt handling. Dermed, Handlinger er Spark RDD-operationer, der giver værdier, der ikke er RDD. Handlingsværdierne gemmes i drivere eller i det eksterne lagersystem

En handling er en af ​​måderne til at sende data fra Executor til driveren.

Eksekutører er agenter, der er ansvarlige for at udføre en opgave. Mens føreren er en JVM-proces, der koordinerer arbejdere og udførelse af opgaven. Nogle af handlingerne fra Spark tælles og samles.

3.2. Gnist SQL

Spark SQL er et Spark-modul til struktureret databehandling. Det bruges primært til at udføre SQL-forespørgsler. DataFrame udgør den vigtigste abstraktion for Spark SQL. Distribueret indsamling af data bestilt i navngivne kolonner er kendt som en DataFrame i Spark.

Spark SQL understøtter hentning af data fra forskellige kilder som Hive, Avro, Parquet, ORC, JSON og JDBC. Det skaleres også til tusindvis af noder og flere timers forespørgsler ved hjælp af Spark-motoren - som giver fuld tolerance for mellemforespørgsel.

3.3. Spark Streaming

Spark Streaming er en udvidelse af kernen Spark API, der muliggør skalerbar, høj gennemstrømning, fejltolerant strømbehandling af live datastrømme. Data kan indtages fra en række kilder, såsom Kafka, Flume, Kinesis eller TCP sockets.

Endelig kan behandlede data skubbes ud til filsystemer, databaser og live dashboards.

3.4. Spark Mlib

MLlib er Sparks bibliotek med maskinindlæring (ML). Målet er at gøre praktisk maskinindlæring skalerbar og nem. På et højt niveau giver det værktøjer som:

  • ML-algoritmer - almindelige indlæringsalgoritmer som klassificering, regression, klyngedannelse og samarbejdsfiltrering
  • Featurization - funktionsextraktion, transformation, dimensioneringsreduktion og valg
  • Rørledninger - værktøjer til konstruktion, evaluering og indstilling af ML-rørledninger
  • Persistens - gemme og indlæse algoritmer, modeller og rørledninger
  • Hjælpeprogrammer - lineær algebra, statistik, datahåndtering osv.

3.5. Spark GraphX

GraphX ​​er en komponent til grafer og graf-parallelle beregninger. På et højt niveau udvider GraphX ​​Spark RDD ved at introducere en ny grafabstraktion: en rettet multigraf med egenskaber knyttet til hvert toppunkt og kant.

For at understøtte grafberegning udsætter GraphX ​​et sæt grundlæggende operatører (f.eks. undergraf, joinVerticesog aggregateMessages).

Derudover inkluderer GraphX ​​en voksende samling af grafalgoritmer og bygherrer for at forenkle grafanalyseopgaver.

4. "Hello World" i Spark

Nu hvor vi forstår kernekomponenterne, kan vi gå videre til et enkelt Maven-baseret Spark-projekt - til beregning af ordtællinger.

Vi demonstrerer, at Spark kører i den lokale tilstand, hvor alle komponenterne kører lokalt på den samme maskine, hvor det er masternoden, eksekverernoder eller Sparks uafhængige klyngemanager.

4.1. Maven opsætning

Lad os oprette et Java Maven-projekt med Spark-relaterede afhængigheder i pom.xml fil:

  org.apache.spark gnistkerne_2.10 1.6.0 

4.2. Ordtælling - Spark Job

Lad os nu skrive Spark-job for at behandle en fil, der indeholder sætninger og udskrive forskellige ord og deres antal i filen:

offentlig statisk ugyldig hoved (String [] args) kaster Undtagelse {if (args.length <1) {System.err.println ("Usage: JavaWordCount"); System.exit (1); } SparkConf sparkConf = ny SparkConf (). SetAppName ("JavaWordCount"); JavaSparkContext ctx = ny JavaSparkContext (sparkConf); JavaRDD linjer = ctx.textFile (args [0], 1); JavaRDD-ord = lines.flatMap (s -> Arrays.asList (SPACE.split (s)). Iterator ()); JavaPairRDD ones = words.mapToPair (word -> new Tuple2 (word, 1)); JavaPairRDD tæller = ones.reduceByKey ((Heltal i1, Heltal i2) -> i1 + i2); Liste output = tæller. indsamle (); for (Tuple2 tuple: output) {System.out.println (tuple._1 () + ":" + tuple._2 ()); } ctx.stop (); }

Bemærk, at vi sender stien til den lokale tekstfil som et argument til et Spark-job.

EN SparkContext objekt er det vigtigste indgangspunkt for Spark og repræsenterer forbindelsen til en allerede kørende Spark-klynge. Det bruger SparkConf objekt til beskrivelse af applikationskonfigurationen. SparkContext bruges til at læse en tekstfil i hukommelsen som en JavaRDD objekt.

Dernæst transformerer vi linjerne JavaRDD gøre indsigelse mod ord JavaRDD objekt ved hjælp af flatmap metode til først at konvertere hver linje til mellemrumsseparerede ord og derefter flade output fra hver linjebehandling.

Vi anvender igen transformationsoperation mapToPair som grundlæggende kortlægger hver forekomst af ordet til ordet og antallet af 1.

Derefter anvender vi reducereByKey operation for at gruppere flere forekomster af ethvert ord med tælling 1 til en tuple af ord og opsummerede tællingen.

Endelig udfører vi cvælg RDD-handling for at få de endelige resultater.

4.3. Udførelse - Spark Job

Lad os nu bygge projektet ved hjælp af Maven til at generere apache-spark-1.0-SNAPSHOT.jar i målmappen.

Derefter skal vi indsende dette WordCount-job til Spark:

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

Gnistinstallationsmappe og WordCount Maven-projektmappe skal opdateres, før du kører over kommandoen.

Efter indsendelse sker der et par trin bag kulisserne:

  1. Fra førerkoden, SparkContext opretter forbindelse til klyngemanager (i vores tilfælde gnister standalone klyngemanager, der kører lokalt)
  2. Cluster Manager tildeler ressourcer på tværs af de andre applikationer
  3. Spark erhverver eksekutører på noder i klyngen. Her får vores ordtællingsapplikation sine egne eksekveringsprocesser
  4. Ansøgningskode (jar-filer) sendes til eksekutører
  5. Opgaver sendes af SparkContext til eksekutorerne.

Endelig returneres resultatet af gnistjob til driveren, og vi vil se antallet af ord i filen som output:

Hej 1 fra 2 Baledung 2 Keep 1 Learning 1 Spark 1 Bye 1

5. Konklusion

I denne artikel diskuterede vi arkitekturen og de forskellige komponenter i Apache Spark. Vi demonstrerede også et fungerende eksempel på et Spark-job, der giver ordtællinger fra en fil.

Som altid er den fulde kildekode tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found