Wat is Apache Spark? Het big data-platform dat Hadoop verpletterde

Apache Spark gedefinieerd

Apache Spark is een gegevensverwerkingsraamwerk dat snel verwerkingstaken kan uitvoeren op zeer grote gegevenssets, en dat ook gegevensverwerkingstaken kan verdelen over meerdere computers, afzonderlijk of in combinatie met andere gedistribueerde computertools. Deze twee kwaliteiten zijn de sleutel tot de werelden van big data en machine learning, waarvoor enorme rekenkracht nodig is om door grote datastores te kraken. Spark neemt ook een deel van de programmeerlast van deze taken uit de schouders van ontwikkelaars met een gebruiksvriendelijke API die veel van het zware werk van gedistribueerd computergebruik en big data-verwerking wegneemt.

Vanaf het bescheiden begin in het AMPLab aan UC Berkeley in 2009, is Apache Spark een van de belangrijkste frameworks voor gedistribueerde verwerking van big data ter wereld geworden. Spark kan op verschillende manieren worden ingezet, biedt native bindingen voor de programmeertalen Java, Scala, Python en R en ondersteunt SQL, streaming data, machine learning en grafiekverwerking. U zult zien dat het wordt gebruikt door banken, telecommunicatiebedrijven, gamebedrijven, overheden en alle grote technische giganten zoals Apple, Facebook, IBM en Microsoft.

Apache Spark-architectuur

Op een fundamenteel niveau bestaat een Apache Spark-applicatie uit twee hoofdcomponenten: een stuurprogramma, dat de code van de gebruiker omzet in meerdere taken die over werkknooppunten kunnen worden verdeeld, en uitvoerders, die op die knooppunten draaien en de taken uitvoeren die aan hen zijn toegewezen. Een vorm van clustermanager is nodig om tussen beide te bemiddelen.

Spark kan out-of-the-box worden uitgevoerd in een zelfstandige clustermodus waarvoor eenvoudig het Apache Spark-framework en een JVM op elke machine in uw cluster nodig is. Het is echter waarschijnlijker dat u wilt profiteren van een robuuster resource- of clusterbeheersysteem om ervoor te zorgen dat werknemers op aanvraag voor u worden toegewezen. In de onderneming betekent dit normaal gesproken dat u op Hadoop YARN moet draaien (dit is hoe de Cloudera- en Hortonworks-distributies Spark-taken uitvoeren), maar Apache Spark kan ook worden uitgevoerd op Apache Mesos, Kubernetes en Docker Swarm.

Als u op zoek bent naar een beheerde oplossing, dan is Apache Spark te vinden als onderdeel van Amazon EMR, Google Cloud Dataproc en Microsoft Azure HDInsight. Databricks, het bedrijf dat de oprichters van Apache Spark in dienst heeft, biedt ook het Databricks Unified Analytics Platform, een uitgebreide beheerde service die Apache Spark-clusters, streamingondersteuning, geïntegreerde webgebaseerde notebookontwikkeling en geoptimaliseerde cloud-I / O-prestaties biedt. een standaard Apache Spark-distributie.

Apache Spark bouwt de gegevensverwerkingsopdrachten van de gebruiker op in een Directed Acyclic Graph of DAG. De DAG is de planningslaag van Apache Spark; het bepaalt welke taken worden uitgevoerd op welke knooppunten en in welke volgorde.  

Spark vs. Hadoop: waarom Apache Spark gebruiken?

Het is de moeite waard erop te wijzen dat Apache Spark vs. Apache Hadoop een beetje een verkeerde benaming is. Spark is tegenwoordig bij de meeste Hadoop-distributies inbegrepen. Maar vanwege twee grote voordelen is Spark het voorkeursraamwerk geworden bij het verwerken van big data, waarmee het oude MapReduce-paradigma voorbij is gegaan dat Hadoop op de voorgrond bracht.

Het eerste voordeel is snelheid. De in-memory data-engine van Spark betekent dat het taken tot honderd keer sneller kan uitvoeren dan MapReduce in bepaalde situaties, vooral in vergelijking met taken met meerdere fasen waarbij de status tussen de fasen weer naar schijf moet worden geschreven. In wezen creëert MapReduce een uitvoeringsgrafiek in twee fasen die bestaat uit het in kaart brengen en verkleinen van gegevens, terwijl de DAG van Apache Spark meerdere fasen heeft die efficiënter kunnen worden gedistribueerd. Zelfs Apache Spark-taken waarbij de gegevens niet volledig in het geheugen kunnen worden opgeslagen, zijn meestal ongeveer 10 keer sneller dan hun MapReduce-tegenhanger.

Het tweede voordeel is de ontwikkelaarsvriendelijke Spark API. Hoe belangrijk de versnelling van Spark ook is, je zou kunnen stellen dat de vriendelijkheid van de Spark API nog belangrijker is.

Vonk kern

In vergelijking met MapReduce en andere Apache Hadoop-componenten, is de Apache Spark API erg vriendelijk voor ontwikkelaars en verbergt een groot deel van de complexiteit van een gedistribueerde verwerkingsengine achter eenvoudige methodeaanroepen. Het canonieke voorbeeld hiervan is hoe bijna 50 regels MapReduce-code om woorden in een document te tellen, kunnen worden teruggebracht tot slechts een paar regels Apache Spark (hier weergegeven in Scala):

val textFile = sparkSession.sparkContext.textFile ("hdfs: /// tmp / words")

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

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

                      .reduceByKey (_ + _)

counts.saveAsTextFile ("hdfs: /// tmp / words_agg")

Door bindingen te bieden aan populaire talen voor data-analyse zoals Python en R, evenals de meer ondernemingsvriendelijke Java en Scala, stelt Apache Spark iedereen in staat, van applicatieontwikkelaars tot datawetenschappers, om de schaalbaarheid en snelheid op een toegankelijke manier te benutten.

Spark RDD

De kern van Apache Spark wordt gevormd door het concept van de Resilient Distributed Dataset (RDD), een programmeer-abstractie die een onveranderlijke verzameling objecten vertegenwoordigt die over een computercluster kunnen worden verdeeld. Bewerkingen op de RDD's kunnen ook over het cluster worden verdeeld en in een parallel batchproces worden uitgevoerd, wat leidt tot een snelle en schaalbare parallelle verwerking.

RDD's kunnen worden gemaakt van eenvoudige tekstbestanden, SQL-databases, NoSQL-winkels (zoals Cassandra en MongoDB), Amazon S3-buckets en nog veel meer. Een groot deel van de Spark Core API is gebouwd op dit RDD-concept, waardoor traditionele kaarten en verminderde functionaliteit mogelijk zijn, maar ook ingebouwde ondersteuning bieden voor het samenvoegen van datasets, filtering, steekproeven en aggregatie.

Spark werkt op een gedistribueerde manier door een driver- kernproces te combineren dat een Spark-applicatie opsplitst in taken en deze verdeelt over vele executor- processen die het werk doen. Deze uitvoerders kunnen worden vergroot en verkleind, afhankelijk van de behoeften van de toepassing.

Spark SQL

Spark SQL, oorspronkelijk bekend als Shark, is steeds belangrijker geworden voor het Apache Spark-project. Het is waarschijnlijk de interface die het meest wordt gebruikt door de huidige ontwikkelaars bij het maken van applicaties. Spark SQL is gericht op de verwerking van gestructureerde gegevens, met behulp van een dataframe-benadering die is geleend van R en Python (in Panda's). Maar zoals de naam al doet vermoeden, biedt Spark SQL ook een SQL2003-compatibele interface voor het opvragen van gegevens, waardoor zowel analisten als ontwikkelaars de kracht van Apache Spark krijgen.

Naast standaard SQL-ondersteuning biedt Spark SQL een standaardinterface voor het lezen van en schrijven naar andere datastores, waaronder JSON, HDFS, Apache Hive, JDBC, Apache ORC en Apache Parquet, die allemaal out-of-the-box worden ondersteund. Andere populaire winkels - Apache Cassandra, MongoDB, Apache HBase en vele andere - kunnen worden gebruikt door afzonderlijke connectoren uit het Spark Packages-ecosysteem binnen te halen.

Het selecteren van enkele kolommen uit een dataframe is zo simpel als deze regel:

CitiesDF.select ("naam", "pop")

Met behulp van de SQL-interface registreren we het dataframe als een tijdelijke tabel, waarna we er SQL-queries tegen kunnen doen:

CitiesDF.createOrReplaceTempView ("steden")

spark.sql ("SELECTEER naam, pop UIT steden")

Achter de schermen gebruikt Apache Spark een query-optimalisatieprogramma genaamd Catalyst dat gegevens en query's onderzoekt om een ​​efficiënt queryplan te produceren voor datalocaliteit en berekeningen die de vereiste berekeningen in het hele cluster uitvoeren. In het Apache Spark 2.x-tijdperk is de Spark SQL-interface van dataframes en datasets (in wezen een getypt dataframe dat tijdens het compileren kan worden gecontroleerd op juistheid en profiteer van meer geheugen en rekenoptimalisaties tijdens runtime) de aanbevolen aanpak voor ontwikkeling . De RDD-interface is nog steeds beschikbaar, maar wordt alleen aanbevolen als aan uw behoeften niet kan worden voldaan binnen het Spark SQL-paradigma.

Spark 2.4 introduceerde een reeks ingebouwde functies van hogere orde voor het rechtstreeks manipuleren van arrays en andere gegevenstypen van hogere orde.

Spark MLlib

Apache Spark bundelt ook bibliotheken voor het toepassen van machine learning en grafische analysetechnieken op gegevens op schaal. Spark MLlib bevat een raamwerk voor het maken van machine learning-pijplijnen, waardoor een eenvoudige implementatie van feature-extractie, selecties en transformaties op elke gestructureerde dataset mogelijk is. MLlib wordt geleverd met gedistribueerde implementaties van clustering- en classificatie-algoritmen zoals k-mean clustering en willekeurige forests die gemakkelijk in en uit aangepaste pijplijnen kunnen worden geruild. Modellen kunnen worden getraind door datawetenschappers in Apache Spark met R of Python, worden opgeslagen met MLlib en vervolgens geïmporteerd in een op Java of Scala gebaseerde pijplijn voor productiegebruik.

Merk op dat hoewel Spark MLlib basis machine learning omvat inclusief classificatie, regressie, clustering en filtering, het geen faciliteiten bevat voor het modelleren en trainen van diepe neurale netwerken (voor details zie de Spark MLlib review). Er zijn echter Deep Learning Pipelines in de maak.

Spark GraphX

Spark GraphX ​​wordt geleverd met een selectie van gedistribueerde algoritmen voor het verwerken van grafiekstructuren, inclusief een implementatie van Google's PageRank. Deze algoritmen gebruiken de RDD-benadering van Spark Core voor het modelleren van gegevens; Met het GraphFrames-pakket kunt u grafiekbewerkingen uitvoeren op dataframes, inclusief het gebruik van de Catalyst-optimizer voor grafiekquery's.

Spark-streaming

Spark Streaming was een vroege toevoeging aan Apache Spark en hielp het grip te krijgen in omgevingen die realtime of bijna realtime verwerking vereisten. Voorheen waren batch- en streamverwerking in de wereld van Apache Hadoop aparte dingen. U zou MapReduce-code schrijven voor uw batchverwerkingsbehoeften en zoiets als Apache Storm gebruiken voor uw realtime streamingvereisten. Dit leidt uiteraard tot ongelijksoortige codebases die gesynchroniseerd moeten worden voor het toepassingsdomein, ondanks dat ze gebaseerd zijn op totaal verschillende frameworks, verschillende bronnen vereisen en verschillende operationele problemen met zich meebrengen om ze uit te voeren.

Spark Streaming breidde het Apache Spark-concept van batchverwerking uit naar streaming door de stream op te splitsen in een continue reeks microbatches, die vervolgens konden worden gemanipuleerd met behulp van de Apache Spark API. Op deze manier kan code in batch- en streamingbewerkingen (grotendeels) dezelfde code delen, draaiend op hetzelfde framework, waardoor zowel de overhead voor ontwikkelaars als operators worden verminderd. Iedereen wint.

Een punt van kritiek op de Spark Streaming-aanpak is dat microbatching, in scenario's waarin een respons met lage latentie op inkomende gegevens vereist is, mogelijk niet kan overeenkomen met de prestaties van andere streaming-geschikte frameworks zoals Apache Storm, Apache Flink en Apache Apex, die allemaal een pure streamingmethode gebruiken in plaats van microbatches.

Gestructureerde streaming

Gestructureerde streaming (toegevoegd in Spark 2.x) is voor Spark Streaming wat Spark SQL was voor de Spark Core-API's: een API op hoger niveau en eenvoudigere abstractie voor het schrijven van applicaties. In het geval van Structure Streaming stelt de API op een hoger niveau in wezen ontwikkelaars in staat om oneindige streaming-dataframes en datasets te maken. Het lost ook enkele zeer reële pijnpunten op waar gebruikers mee worstelden in het eerdere raamwerk, vooral met betrekking tot het omgaan met event-time aggregaties en te late bezorging van berichten. Alle query's op gestructureerde streams gaan via de Catalyst-queryoptimalisatie en kunnen zelfs op een interactieve manier worden uitgevoerd, zodat gebruikers SQL-query's kunnen uitvoeren op live streaming-gegevens.

Gestructureerde streaming was oorspronkelijk gebaseerd op het microbatchschema van Spark Streaming voor het verwerken van streaminggegevens. Maar in Spark 2.3 heeft het Apache Spark-team een ​​continue verwerkingsmodus met lage latentie toegevoegd aan gestructureerde streaming, waardoor het reacties kan verwerken met latenties van slechts 1 ms, wat erg indrukwekkend is. Vanaf Spark 2.4 wordt continue verwerking nog steeds als experimenteel beschouwd. Hoewel Structured Streaming bovenop de Spark SQL-engine is gebouwd, ondersteunt Continuous Streaming slechts een beperkte set query's.

Gestructureerde streaming is de toekomst van streamingtoepassingen met het platform, dus als u een nieuwe streamingtoepassing bouwt, moet u gestructureerde streaming gebruiken. De verouderde Spark Streaming-API's worden nog steeds ondersteund, maar het project raadt aan om over te schakelen naar gestructureerde streaming, omdat de nieuwe methode het schrijven en onderhouden van streamingcode een stuk draaglijker maakt.

Pijplijnen voor diepgaand leren

Apache Spark ondersteunt deep learning via Deep Learning Pipelines. Met behulp van de bestaande pijplijnstructuur van MLlib kunt u diepgaande leerbibliotheken op een lager niveau oproepen en classificaties samenstellen in slechts een paar regels code, en aangepaste TensorFlow-grafieken of Keras-modellen toepassen op inkomende gegevens. Deze grafieken en modellen kunnen zelfs worden geregistreerd als aangepaste Spark SQL UDF's (door de gebruiker gedefinieerde functies), zodat de deep learning-modellen kunnen worden toegepast op gegevens als onderdeel van SQL-instructies.

Apache Spark-zelfstudies

Klaar om in te duiken en Apache Spark te leren? We raden Evan Heitman's A Neanderthal's Guide to Apache Spark in Python ten zeerste aan, die niet alleen de basis legt van hoe Apache Spark werkt in relatief eenvoudige bewoordingen, maar je ook begeleidt bij het schrijven van een eenvoudige Python-applicatie die gebruik maakt van het framework . Het artikel is geschreven vanuit het perspectief van een datawetenschapper, wat logisch is aangezien data science een wereld is waarin big data en machine learning steeds belangrijker worden.

Als je op zoek bent naar enkele Apache Spark-voorbeelden om je een idee te geven van wat het platform kan en hoe het werkt, kijk dan eens naar Spark By {Voorbeelden}. Er is hier veel voorbeeldcode voor een aantal basistaken die de bouwstenen van Spark-programmering vormen, zodat u de componenten kunt zien waaruit de grotere taken bestaan ​​waarvoor Apache Spark is gemaakt.

Moet u dieper gaan? DZone heeft waarnaar het bescheiden verwijst als The Complete Apache Spark Collection, die bestaat uit een hele reeks handige tutorials over veel Apache Spark-onderwerpen. Veel plezier met leren!