Programmering

Hvad er Apache Spark? Den store dataplatform, der knuste Hadoop

Apache Spark defineret

Apache Spark er en databehandlingsramme, der hurtigt kan udføre behandlingsopgaver på meget store datasæt og kan også distribuere databehandlingsopgaver på tværs af flere computere, enten alene eller sammen med andre distribuerede databehandlingsværktøjer. Disse to kvaliteter er nøglen til verdener af big data og maskinindlæring, som kræver opsamling af massiv computerkraft for at knuse gennem store datalagre. Spark tager også nogle af programmeringsbyrderne for disse opgaver væk fra udviklernes skuldre med en brugervenlig API, der opsummerer meget af grunt arbejde med distribueret databehandling og big data-behandling.

Fra sin ydmyge begyndelse i AMPLab i U.C. Berkeley i 2009, Apache Spark er blevet en af ​​de vigtigste store datadistribuerede behandlingsrammer i verden. Gnist kan implementeres på en række forskellige måder, giver native bindinger til programmeringssprogene Java, Scala, Python og R og understøtter SQL, streaming af data, maskinindlæring og grafbehandling. Du finder det brugt af banker, telekommunikationsselskaber, spilvirksomheder, regeringer og alle de store teknologiske giganter som Apple, Facebook, IBM og Microsoft.

Apache Spark-arkitektur

På et grundlæggende niveau består en Apache Spark-applikation af to hovedkomponenter: a chauffør, der konverterer brugerens kode til flere opgaver, der kan distribueres på tværs af medarbejdernoder, og eksekutører, som kører på disse noder og udfører de opgaver, der er tildelt dem. En eller anden form for klyngemanager er nødvendig for at mægle mellem de to.

Uden for boksen kan Spark køre i en enkeltstående klyngetilstand, der simpelthen kræver Apache Spark-rammen og en JVM på hver maskine i din klynge. Det er dog mere sandsynligt, at du vil drage fordel af et mere robust ressource- eller klyngestyringssystem for at tage sig af tildeling af arbejdere efter behov for dig. I virksomheden betyder dette normalt at køre på Hadoop YARN (sådan kører Cloudera og Hortonworks-distributionerne Spark-job), men Apache Spark kan også køre på Apache Mesos, Kubernetes og Docker Swarm.

Hvis du søger en administreret løsning, kan Apache Spark findes som en del af Amazon EMR, Google Cloud Dataproc og Microsoft Azure HDInsight. Databricks, firmaet, der beskæftiger grundlæggerne af Apache Spark, tilbyder også Databricks Unified Analytics Platform, som er en omfattende administreret service, der tilbyder Apache Spark-klynger, streaming-support, integreret webbaseret notebook-udvikling og optimeret cloud I / O-ydeevne over en standard Apache Spark-distribution.

Apache Spark bygger brugerens kommandoer til databehandling til en Instrueret cyklisk grafeller DAG. DAG er Apache Sparks planlægningslag; det bestemmer, hvilke opgaver der udføres på hvilke noder og i hvilken rækkefølge.

Spark vs. Hadoop: Hvorfor bruge Apache Spark?

Det er værd at påpege, at Apache Spark vs. Apache Hadoop er lidt misvisende. Du finder Spark inkluderet i de fleste Hadoop-distributioner i disse dage. Men på grund af to store fordele er Spark blevet den valgte ramme ved behandling af big data og overhalet det gamle MapReduce-paradigme, der førte Hadoop til fremtrædende plads.

Den første fordel er hastighed. Sparks datamotor i hukommelsen betyder, at den kan udføre opgaver op til hundrede gange hurtigere end MapReduce i visse situationer, især når man sammenligner med job i flere trin, der kræver skrivning af tilstand tilbage til disk mellem trin. Kort sagt opretter MapReduce en to-trins eksekveringsgraf, der består af datakortlægning og -reduktion, hvorimod Apache Sparks DAG har flere trin, der kan distribueres mere effektivt. Selv Apache Spark-job, hvor dataene ikke kan være helt indeholdt i hukommelsen, har en tendens til at være omkring 10 gange hurtigere end deres MapReduce-modstykke.

Den anden fordel er den udviklervenlige Spark API. Så vigtig som Sparks speedup er, kan man argumentere for, at Spark API's venlighed er endnu vigtigere.

Gnistkerne

I sammenligning med MapReduce og andre Apache Hadoop-komponenter er Apache Spark API meget venlig over for udviklere, der skjuler meget af kompleksiteten af ​​en distribueret behandlingsmotor bag enkle metodeopkald. Det kanoniske eksempel på dette er, hvordan næsten 50 linjer MapReduce-kode for at tælle ord i et dokument kan reduceres til blot et par linjer Apache Spark (her vist i Scala):

val textFile = sparkSession.sparkContext.textFile (“hdfs: /// tmp / ord”)

val counts = textFile.flatMap (line => line.split (““))

.map (word => (word, 1))

.reduceByKey (_ + _)

tæller.saveAsTextFile (“hdfs: /// tmp / words_agg”)

Ved at levere bindinger til populære sprog til dataanalyse som Python og R samt det mere virksomhedsvenlige Java og Scala giver Apache Spark alle, fra applikationsudviklere til dataforskere, mulighed for at udnytte dets skalerbarhed og hastighed på en tilgængelig måde.

Spark RDD

Kernen i Apache Spark er begrebet Resilient Distribueret datasæt (RDD), en programmeringsabstraktion, der repræsenterer en uforanderlig samling af objekter, der kan opdeles på tværs af en computerklynge. Operationer på RDD'erne kan også opdeles på tværs af klyngen og udføres i en parallel batchproces, hvilket fører til hurtig og skalerbar parallelbehandling.

RDD'er kan oprettes fra enkle tekstfiler, SQL-databaser, NoSQL-butikker (såsom Cassandra og MongoDB), Amazon S3-spande og meget mere udover. Meget af Spark Core API er bygget på dette RDD-koncept, der muliggør traditionel kort og reducerer funktionalitet, men giver også indbygget support til sammenføjning af datasæt, filtrering, sampling og aggregering.

Spark kører distribueret ved at kombinere en chauffør kerneproces, der opdeler en Spark-applikation i opgaver og distribuerer dem blandt mange eksekutor processer, der udfører arbejdet. Disse eksekutører kan skaleres op og ned efter behov for applikationens behov.

Gnist SQL

Oprindeligt kendt som Shark, er Spark SQL blevet mere og mere vigtigt for Apache Spark-projektet. Det er sandsynligvis den grænseflade, der oftest bruges af nutidens udviklere, når de opretter applikationer. Spark SQL er fokuseret på behandling af strukturerede data ved hjælp af en dataframe-tilgang lånt fra R og Python (i Pandas). Men som navnet antyder, giver Spark SQL også en SQL2003-kompatibel grænseflade til forespørgsel på data, hvilket bringer kraften fra Apache Spark til både analytikere og udviklere.

Udover standard SQL-understøttelse giver Spark SQL en standardgrænseflade til læsning fra og skrivning til andre datalagre, herunder JSON, HDFS, Apache Hive, JDBC, Apache ORC og Apache Parquet, som alle understøttes uden for boksen. Andre populære butikker - Apache Cassandra, MongoDB, Apache HBase og mange andre - kan bruges ved at trække i separate stik fra Spark Packages-økosystemet.

At vælge nogle kolonner fra en dataramme er så simpelt som denne linje:

citiesDF.select (“navn”, “pop”)

Ved hjælp af SQL-grænsefladen registrerer vi datarammen som en midlertidig tabel, hvorefter vi kan udstede SQL-forespørgsler mod den:

citiesDF.createOrReplaceTempView (“byer”)

spark.sql (“VÆLG navn, pop FRA byer”)

Bag kulisserne bruger Apache Spark en forespørgselsoptimeringsværktøj kaldet Catalyst, der undersøger data og forespørgsler for at producere en effektiv forespørgselsplan for datalokalitet og beregning, der udfører de krævede beregninger på tværs af klyngen. I Apache Spark 2.x-æraen er Spark SQL-grænsefladen mellem dataframes og datasæt (i det væsentlige en indtastet dataframe, der kan kontrolleres ved kompileringstid for korrekthed og drage fordel af yderligere hukommelse og beregningsoptimeringer på kørselstid) den anbefalede metode til udvikling . RDD-grænsefladen er stadig tilgængelig, men anbefales kun, hvis dine behov ikke kan imødekommes inden for Spark SQL-paradigmet.

Spark 2.4 introducerede et sæt indbyggede funktioner i højere ordre til direkte manipulation af arrays og andre højere ordens datatyper.

Spark MLlib

Apache Spark samler også biblioteker til anvendelse af maskinindlæring og grafanalyseteknikker til data i målestok. Spark MLlib inkluderer en ramme til oprettelse af maskinlæringsrørledninger, der giver mulighed for nem implementering af udtrækning af funktioner, valg og transformationer i ethvert struktureret datasæt. MLlib leveres med distribuerede implementeringer af grupperings- og klassificeringsalgoritmer såsom k-betyder klyngedannelse og tilfældige skove, der let kan byttes ind og ud af brugerdefinerede rørledninger. Modeller kan trænes af dataforskere i Apache Spark ved hjælp af R eller Python, gemmes ved hjælp af MLlib og derefter importeres til en Java-baseret eller Scala-baseret pipeline til produktionsbrug.

Bemærk, at mens Spark MLlib dækker grundlæggende maskinindlæring inklusive klassificering, regression, klyngedannelse og filtrering, inkluderer den ikke faciliteter til modellering og træning af dybe neurale netværk (for detaljer se 'Spark MLlib-gennemgang). Dog er Deep Learning Pipelines undervejs.

Spark GraphX

Spark GraphX ​​leveres med et udvalg af distribuerede algoritmer til behandling af grafstrukturer inklusive implementering af Googles PageRank. Disse algoritmer bruger Spark Core's RDD-tilgang til modellering af data; GraphFrames-pakken giver dig mulighed for at udføre grafhandlinger på dataframes, herunder udnytte Catalyst optimizer til grafforespørgsler.

Spark Streaming

Spark Streaming var en tidlig tilføjelse til Apache Spark, der hjalp det med at få trækkraft i miljøer, der krævede realtids- eller næsten realtidsbehandling. Tidligere var batch- og stream-behandling i Apache Hadoop-verdenen separate ting. Du ville skrive MapReduce-kode til dine batchbehandlingsbehov og bruge noget som Apache Storm til dine realtidskrav til streaming. Dette fører naturligvis til forskellige kodebaser, der skal holdes synkroniseret for applikationsdomænet på trods af at de er baseret på helt forskellige rammer, der kræver forskellige ressourcer og involverer forskellige operationelle bekymringer for at køre dem.

Spark Streaming udvidede Apache Spark-konceptet med batchbehandling til streaming ved at nedbryde strømmen ned i en kontinuerlig række mikrobatcher, som derefter kunne manipuleres ved hjælp af Apache Spark API. På denne måde kan kode i batch- og streamingoperationer dele (for det meste) den samme kode, der kører på samme ramme, hvilket reducerer både udvikler- og operatøromkostninger. Alle vinder.

En kritik af Spark Streaming-metoden er, at mikrobatching i scenarier, hvor et lav-latency-svar på indgående data er påkrævet, muligvis ikke kan matche præstationen for andre streaming-kompatible rammer som Apache Storm, Apache Flink og Apache Apex, som alle bruger en ren streaming-metode snarere end mikrobatcher.

Struktureret streaming

Struktureret streaming (tilføjet i Spark 2.x) er at Spark Streaming, hvad Spark SQL var for Spark Core API'erne: Et API på højere niveau og lettere abstraktion til at skrive applikationer. I tilfælde af strukturstreaming tillader API'en på højere niveau i det væsentlige udviklere at oprette uendelige streaming dataframes og datasæt. Det løser også nogle meget reelle smertepunkter, som brugerne har kæmpet med i de tidligere rammer, især hvad angår håndtering af begivenhedstidsaggregeringer og sen levering af meddelelser. Alle forespørgsler på strukturerede streams går gennem Catalyst-forespørgselsoptimeringsværktøjet og kan endda køres på en interaktiv måde, så brugerne kan udføre SQL-forespørgsler mod live streaming-data.

Struktureret streaming stod oprindeligt på Spark Streamings mikrobatching-ordning til håndtering af streamingdata. Men i Spark 2.3 tilføjede Apache Spark-teamet en kontinuerlig bearbejdningstilstand med lav latens til struktureret streaming, så det kunne håndtere svar med latenser så lave som 1 ms, hvilket er meget imponerende. Fra og med Spark 2.4 betragtes kontinuerlig behandling stadig som eksperimentel. Mens struktureret streaming er bygget oven på Spark SQL-motoren, understøtter kontinuerlig streaming kun et begrænset sæt forespørgsler.

Struktureret streaming er fremtiden for streaming-applikationer med platformen, så hvis du bygger en ny streaming-applikation, skal du bruge struktureret streaming. De ældre API'er til Spark Streaming vil fortsat blive understøttet, men projektet anbefaler, at man overfører til Structured Streaming, da den nye metode gør skrivning og vedligeholdelse af streamingkode meget mere tålelig.

Deep Learning Pipelines

Apache Spark understøtter dyb læring via Deep Learning Pipelines. Ved hjælp af den eksisterende rørledningsstruktur i MLlib kan du kalde på dyblæringsbiblioteker på lavere niveau og konstruere klassifikatorer i blot et par kodelinjer samt anvende brugerdefinerede TensorFlow-grafer eller Keras-modeller til indgående data. Disse grafer og modeller kan endda registreres som brugerdefinerede Spark SQL UDF'er (brugerdefinerede funktioner), så deep learning-modellerne kan anvendes på data som en del af SQL-sætninger.

Apache Spark tutorials

Klar til at dykke ind og lære Apache Spark? Vi anbefaler stærkt Evan Heitmans A Neanderthal's Guide to Apache Spark in Python, som ikke kun beskriver det grundlæggende om, hvordan Apache Spark fungerer i relativt enkle termer, men også guider dig gennem processen med at skrive en simpel Python-applikation, der gør brug af rammen . Artiklen er skrevet ud fra en dataforskers perspektiv, hvilket giver mening, da datavidenskab er en verden, hvor big data og maskinindlæring bliver mere og mere kritisk.

Hvis du leder efter nogle Apache Spark-eksempler, der giver dig en fornemmelse af, hvad platformen kan gøre, og hvordan den gør det, skal du tjekke Spark By {eksempler}. Der er masser af prøvekode her til et antal af de grundlæggende opgaver, der udgør byggestenene i Spark-programmering, så du kan se de komponenter, der udgør de større opgaver, som Apache Spark er lavet til.

Brug for at gå dybere? DZone har, hvad det beskedent henviser til som The Complete Apache Spark Collection, som består af en masse nyttige tutorials om mange Apache Spark-emner. Glad læring!