Vad är Apache Spark? Den stora dataplattformen som krossade Hadoop

Apache Spark definierad

Apache Spark är ett ramverk för databehandling som snabbt kan utföra bearbetningsuppgifter på mycket stora datamängder, och kan också distribuera databehandlingsuppgifter över flera datorer, antingen på egen hand eller tillsammans med andra distribuerade datorverktyg. Dessa två kvaliteter är nyckeln till världens stora data- och maskininlärning, vilket kräver en sammanslagning av massiv datorkraft för att slå igenom stora datalagrar. Spark tar också några av programmeringsbördorna för dessa uppgifter från utvecklarnas axlar med ett lättanvänt API som tar bort mycket av det grymma arbetet med distribuerad databehandling och stor databehandling.

Från sin ödmjuka början i AMPLab vid UC Berkeley 2009 har Apache Spark blivit en av de viktigaste ramarna för bearbetning av stora data i världen. Spark kan distribueras på olika sätt, tillhandahåller inbyggda bindningar för programmeringsspråken Java, Scala, Python och R och stöder SQL, strömmande data, maskininlärning och grafbehandling. Du hittar den används av banker, telekommunikationsföretag, spelföretag, regeringar och alla de stora tekniska giganterna som Apple, Facebook, IBM och Microsoft.

Apache Spark-arkitektur

På en grundläggande nivå består en Apache Spark-applikation av två huvudkomponenter: en drivrutin som konverterar användarens kod till flera uppgifter som kan distribueras över arbetarnoder och exekutörer som körs på dessa noder och utför de uppgifter som tilldelats dem. Någon form av klusterhanterare är nödvändig för att förmedla mellan de två.

Utanför lådan kan Spark köras i ett fristående klusterläge som helt enkelt kräver Apache Spark-ramverket och en JVM på varje maskin i ditt kluster. Det är dock mer troligt att du vill dra nytta av ett mer robust resurs- eller klusterhanteringssystem för att ta hand om tilldelning av arbetare på begäran åt dig. I företaget betyder det normalt att man kör på Hadoop YARN (så här distribuerar Cloudera och Hortonworks distributioner Spark-jobb), men Apache Spark kan också köras på Apache Mesos, Kubernetes och Docker Swarm.

Om du söker en hanterad lösning kan Apache Spark hittas som en del av Amazon EMR, Google Cloud Dataproc och Microsoft Azure HDInsight. Databricks, företaget som anställer grundarna av Apache Spark, erbjuder också Databricks Unified Analytics Platform, som är en omfattande hanterad tjänst som erbjuder Apache Spark-kluster, streaming-stöd, integrerad webbaserad utveckling av anteckningsböcker och optimerad moln I / O-prestanda över en vanlig Apache Spark-distribution.

Apache Spark bygger användarens kommandon för databehandling till en Directed Acyclic Graph , eller DAG. DAG är Apache Sparks schemaläggningsskikt; det avgör vilka uppgifter som utförs på vilka noder och i vilken ordning.  

Spark vs. Hadoop: Varför använda Apache Spark?

Det är värt att påpeka att Apache Spark vs. Apache Hadoop är lite felaktig. Du hittar Spark inkluderat i de flesta Hadoop-distributioner dessa dagar. Men på grund av två stora fördelar har Spark blivit det ramverk som valts vid bearbetning av stora data, vilket har förbikopplat det gamla MapReduce-paradigmet som gjorde Hadoop framträdande.

Den första fördelen är hastighet. Sparks in-memory-datormotor betyder att den kan utföra uppgifter upp till hundra gånger snabbare än MapReduce i vissa situationer, särskilt jämfört med flerstegsjobb som kräver skrivning av tillstånd tillbaka till disk mellan steg. I huvudsak skapar MapReduce en tvåstegs exekveringsgraf som består av datakartning och minskning, medan Apache Sparks DAG har flera steg som kan distribueras mer effektivt. Till och med Apache Spark-jobb där data inte kan ingå helt i minnet tenderar att vara cirka tio gånger snabbare än deras motsvarighet till MapReduce.

Den andra fördelen är det utvecklarvänliga Spark API. Så viktigt som Sparks snabbhet är, kan man argumentera för att Spark API: s vänlighet är ännu viktigare.

Spark Core

Jämfört med MapReduce och andra Apache Hadoop-komponenter är Apache Spark API mycket vänlig för utvecklare, döljer mycket av komplexiteten hos en distribuerad bearbetningsmotor bakom enkla metodsamtal. Det kanoniska exemplet på detta är hur nästan 50 rader MapReduce-kod för att räkna ord i ett dokument kan reduceras till bara några rader Apache Spark (här visas i Scala):

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

val räknas = textFile.flatMap (line => line.split (““))

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

                      .reduceByKey (_ + _)

counts.saveAsTextFile (“hdfs: /// tmp / words_agg”)

Genom att tillhandahålla bindningar till populära språk för dataanalys som Python och R, liksom det mer företagsvänliga Java och Scala, tillåter Apache Spark alla från applikationsutvecklare till dataforskare att utnyttja dess skalbarhet och hastighet på ett tillgängligt sätt.

Spark RDD

Kärnan i Apache Spark är begreppet Resilient Distributed Dataset (RDD), en programmeringsabstraktion som representerar en oföränderlig samling objekt som kan delas över ett datakluster. Operationer på RDD kan också delas över klustret och utföras i en parallell batchprocess, vilket leder till snabb och skalbar parallell bearbetning.

RDD kan skapas från enkla textfiler, SQL-databaser, NoSQL-butiker (som Cassandra och MongoDB), Amazon S3-hinkar och mycket mer. Mycket av Spark Core API bygger på detta RDD-koncept, vilket möjliggör traditionell karta och minskar funktionalitet, men ger också inbyggt stöd för att ansluta datasatser, filtrering, sampling och aggregering.

Spark körs i ett distribuerat sätt genom att kombinera en förare kärnprocess som delar en Spark ansökan till uppgifter och distribuerar dem bland många testamentsexekutor processer som gör arbetet. Dessa exekutörer kan skalas upp och ner efter behov för applikationens behov.

Spark SQL

Ursprungligen känd som Shark, har Spark SQL blivit allt viktigare för Apache Spark-projektet. Det är troligtvis det gränssnitt som oftast används av dagens utvecklare när de skapar applikationer. Spark SQL fokuserar på bearbetning av strukturerad data med hjälp av en datarammetod som lånas från R och Python (i Pandas). Men som namnet antyder, tillhandahåller Spark SQL också ett SQL2003-kompatibelt gränssnitt för att fråga data, vilket ger kraften i Apache Spark till både analytiker och utvecklare.

Förutom standard SQL-stöd tillhandahåller Spark SQL ett standardgränssnitt för att läsa från och skriva till andra datalagrar inklusive JSON, HDFS, Apache Hive, JDBC, Apache ORC och Apache Parquet, som alla stöds ur lådan. Andra populära butiker - Apache Cassandra, MongoDB, Apache HBase och många andra - kan användas genom att dra i separata kontakter från Spark Packages-ekosystemet.

Att välja några kolumner från en dataram är så enkelt som den här raden:

townsDF.select (“namn”, “pop”)

Med hjälp av SQL-gränssnittet registrerar vi dataramen som en tillfällig tabell, varefter vi kan utfärda SQL-frågor mot den:

townsDF.createOrReplaceTempView (“städer”)

spark.sql (“VÄLJ namn, pop FRÅN städer”)

Bakom kulisserna använder Apache Spark en sökoptimeringsverktyg som kallas Catalyst som undersöker data och frågor för att producera en effektiv frågeplan för datalokalitet och beräkning som utför de beräkningar som krävs över hela klustret. I Apache Spark 2.x-eran är Spark SQL-gränssnittet för dataframar och datauppsättningar (i huvudsak en skriven dataram som kan kontrolleras vid kompileringstidpunkten för riktighet och dra nytta av ytterligare minne och beräkningsoptimeringar vid körningstid). . RDD-gränssnittet är fortfarande tillgängligt, men rekommenderas endast om dina behov inte kan tillgodoses inom Spark SQL-paradigmet.

Spark 2.4 introducerade en uppsättning inbyggda funktioner i högre ordning för att manipulera matriser och andra datatyper av högre ordning direkt.

Spark MLlib

Apache Spark buntar också bibliotek för att tillämpa maskininlärning och grafanalysmetoder på data i stor skala. Spark MLlib innehåller ett ramverk för att skapa pipelines för maskininlärning, vilket möjliggör enkel implementering av funktionsextraktion, val och transformationer i alla strukturerade dataset. MLlib levereras med distribuerade implementeringar av kluster- och klassificeringsalgoritmer som k-betyder kluster och slumpmässiga skogar som enkelt kan bytas in och ut ur anpassade rörledningar. Modeller kan tränas av dataforskare i Apache Spark med R eller Python, sparas med MLlib och sedan importeras till en Java-baserad eller Scala-baserad pipeline för produktionsanvändning.

Observera att även om Spark MLlib täcker grundläggande maskininlärning inklusive klassificering, regression, kluster och filtrering, inkluderar det inte faciliteter för modellering och träning av djupa neurala nätverk (för detaljer se Spark MLlib-granskning). Emellertid är Deep Learning Pipelines på gång.

Spark GraphX

Spark GraphX ​​levereras med ett urval av distribuerade algoritmer för bearbetning av grafstrukturer inklusive implementering av Googles PageRank. Dessa algoritmer använder Spark Cores RDD-metod för modellering av data. med GraphFrames-paketet kan du utföra grafåtgärder på dataframar, inklusive utnyttja Catalyst-optimeraren för graffrågor.

Spark Streaming

Spark Streaming var ett tidigt tillskott till Apache Spark som hjälpte det att få dragkraft i miljöer som krävde realtids- eller nästan realtidsbehandling. Tidigare var batch- och strömbehandling i Apache Hadoop-världen separata saker. Du skulle skriva MapReduce-kod för dina batchbehandlingsbehov och använda något som Apache Storm för dina strömmande krav i realtid. Detta leder uppenbarligen till olika kodbaser som måste hållas synkroniserade för applikationsdomänen trots att de baseras på helt olika ramar, kräver olika resurser och involverar olika operativa problem för att köra dem.

Spark Streaming utökade Apache Spark-konceptet för batchbearbetning till streaming genom att bryta ner strömmen i en kontinuerlig serie mikrobatcher, som sedan kunde manipuleras med Apache Spark API. På detta sätt kan kod i batch- och strömmande operationer dela (mestadels) samma kod, som körs på samma ram, vilket minskar både utvecklar- och operatörskostnader. Alla vinner.

En kritik av Spark Streaming-metoden är att mikrobatching, i scenarier där ett lågt latenssvar på inkommande data krävs, kanske inte kan matcha prestanda för andra streaming-kompatibla ramar som Apache Storm, Apache Flink och Apache Apex, som alla använder en ren streaming-metod snarare än mikrobatcher.

Strukturerad streaming

Structured Streaming (läggs till i Spark 2.x) är att Spark Streaming vad Spark SQL var för Spark Core API: erna på högre nivå och enklare abstraktion för att skriva applikationer. I fallet med Structure Streaming tillåter API på högre nivå i huvudsak utvecklare att skapa oändliga strömmande dataramar och datauppsättningar. Det löser också några mycket verkliga smärtpunkter som användare har kämpat med i det tidigare ramverket, särskilt när det gäller hantering av händelsetidaggregationer och sen leverans av meddelanden. Alla frågor på strukturerade strömmar går igenom Catalyst-sökoptimiseraren och kan till och med köras på ett interaktivt sätt så att användare kan utföra SQL-frågor mot direktuppspelningsdata.

Structured Streaming förlitar sig ursprungligen på Spark Streamings mikrobatchningsschema för hantering av strömmande data. Men i Spark 2.3 lade Apache Spark-teamet till ett kontinuerligt bearbetningsläge med låg latens i strukturerad strömning, så att det kunde hantera svar med latenser så låga som 1 ms, vilket är mycket imponerande. Från och med Spark 2.4 anses kontinuerlig bearbetning fortfarande vara experimentell. Medan Structured Streaming är byggt ovanpå Spark SQL-motorn stöder kontinuerlig streaming endast en begränsad uppsättning frågor.

Structured Streaming är framtiden för streamingapplikationer med plattformen, så om du bygger en ny streamingapplikation bör du använda Structured Streaming. De äldre API: erna för Spark Streaming kommer fortfarande att stödjas, men projektet rekommenderar att du överför till Structured Streaming, eftersom den nya metoden gör att skrivning och underhåll av streamingkod mycket mer uthärdlig.

Deep Learning Pipelines

Apache Spark stöder djup inlärning via Deep Learning Pipelines. Med den befintliga rörledningsstrukturen i MLlib kan du ringa in djupinlärningsbibliotek på lägre nivå och konstruera klassificeringsapparater på bara några rader kod, samt använda anpassade TensorFlow-grafer eller Keras-modeller på inkommande data. Dessa grafer och modeller kan till och med registreras som anpassade Spark SQL UDF (användardefinierade funktioner) så att djupinlärningsmodellerna kan tillämpas på data som en del av SQL-uttalanden.

Apache Spark-självstudier

Är du redo att dyka in och lära dig Apache Spark? Vi rekommenderar starkt Evan Heitmans A Neanderthal's Guide to Apache Spark in Python, som inte bara beskriver grunderna för hur Apache Spark fungerar i relativt enkla termer utan också guidar dig genom processen att skriva en enkel Python-applikation som använder ramverket . Artikeln är skriven ur ett datavetenskapsperspektiv, vilket är vettigt eftersom datavetenskap är en värld där big data och maskininlärning blir alltmer kritiska.

Om du letar efter några Apache Spark-exempel för att ge dig en uppfattning om vad plattformen kan göra och hur den gör det, kolla in Spark By {exempel}. Det finns gott om exempelkod här för ett antal grundläggande uppgifter som utgör byggstenarna för Spark-programmering, så att du kan se de komponenter som utgör de större uppgifterna som Apache Spark är gjord för.

Behöver du gå djupare? DZone har vad den blygsamt hänvisar till som The Complete Apache Spark Collection, som består av en hel del användbara handledning om många Apache Spark-ämnen. Lyckligt lärande!