Cos'è Apache Spark? La piattaforma di big data che ha distrutto Hadoop

Definizione di Apache Spark

Apache Spark è un framework di elaborazione dati in grado di eseguire rapidamente attività di elaborazione su set di dati molto grandi e può anche distribuire attività di elaborazione dati su più computer, da solo o in tandem con altri strumenti di elaborazione distribuiti. Queste due qualità sono fondamentali per i mondi dei big data e dell'apprendimento automatico, che richiedono lo smistamento di un'enorme potenza di calcolo per analizzare grandi archivi di dati. Spark elimina anche alcuni dei fardelli di programmazione di queste attività dalle spalle degli sviluppatori con un'API di facile utilizzo che astrae gran parte del lavoro grugnito del calcolo distribuito e dell'elaborazione dei big data.

Dalle sue umili origini nell'AMPLab alla UC Berkeley nel 2009, Apache Spark è diventato uno dei principali framework di elaborazione distribuita di big data nel mondo. Spark può essere distribuito in vari modi, fornisce collegamenti nativi per i linguaggi di programmazione Java, Scala, Python e R e supporta SQL, dati in streaming, apprendimento automatico ed elaborazione di grafici. Lo troverai utilizzato da banche, società di telecomunicazioni, società di giochi, governi e tutti i principali giganti della tecnologia come Apple, Facebook, IBM e Microsoft.

Architettura di Apache Spark

A un livello fondamentale, un'applicazione Apache Spark è costituita da due componenti principali: un driver, che converte il codice dell'utente in più attività che possono essere distribuite tra i nodi di lavoro, ed esecutori, che vengono eseguiti su quei nodi ed eseguono le attività a loro assegnate. Una qualche forma di cluster manager è necessaria per mediare tra i due.

Fuori dagli schemi, Spark può essere eseguito in una modalità cluster autonoma che richiede semplicemente il framework Apache Spark e una JVM su ogni macchina nel cluster. Tuttavia, è più probabile che tu voglia trarre vantaggio da un sistema di gestione delle risorse o dei cluster più robusto per occuparti dell'allocazione dei lavoratori su richiesta per te. Nell'azienda, questo normalmente significherà l'esecuzione su Hadoop YARN (è così che le distribuzioni Cloudera e Hortonworks eseguono i lavori Spark), ma Apache Spark può anche essere eseguito su Apache Mesos, Kubernetes e Docker Swarm.

Se cerchi una soluzione gestita, Apache Spark può essere trovato come parte di Amazon EMR, Google Cloud Dataproc e Microsoft Azure HDInsight. Databricks, la società che impiega i fondatori di Apache Spark, offre anche Databricks Unified Analytics Platform, che è un servizio gestito completo che offre cluster Apache Spark, supporto per lo streaming, sviluppo di notebook integrato basato sul web e prestazioni ottimizzate di I / O cloud su una distribuzione standard di Apache Spark.

Apache Spark crea i comandi di elaborazione dei dati dell'utente in un grafico aciclico diretto o DAG. Il DAG è il livello di pianificazione di Apache Spark; determina quali attività vengono eseguite su quali nodi e in quale sequenza.  

Spark vs Hadoop: perché utilizzare Apache Spark?

Vale la pena sottolineare che Apache Spark vs. Apache Hadoop è un nome un po 'improprio. Al giorno d'oggi troverai Spark incluso nella maggior parte delle distribuzioni Hadoop. Ma a causa di due grandi vantaggi, Spark è diventato il framework di scelta durante l'elaborazione dei big data, superando il vecchio paradigma MapReduce che ha portato Hadoop alla ribalta.

Il primo vantaggio è la velocità. Il motore di dati in memoria di Spark significa che può eseguire attività fino a cento volte più velocemente di MapReduce in determinate situazioni, in particolare se confrontato con lavori in più fasi che richiedono la scrittura dello stato su disco tra le fasi. In sostanza, MapReduce crea un grafico di esecuzione a due fasi costituito da mappatura e riduzione dei dati, mentre il DAG di Apache Spark ha più fasi che possono essere distribuite in modo più efficiente. Anche i lavori di Apache Spark in cui i dati non possono essere completamente contenuti nella memoria tendono ad essere circa 10 volte più veloci della loro controparte MapReduce.

Il secondo vantaggio è l'API Spark per sviluppatori. Per quanto sia importante l'accelerazione di Spark, si potrebbe sostenere che la cordialità dell'API Spark è ancora più importante.

Spark Core

In confronto a MapReduce e ad altri componenti Apache Hadoop, l'API Apache Spark è molto amichevole per gli sviluppatori, nascondendo gran parte della complessità di un motore di elaborazione distribuito dietro semplici chiamate di metodo. L'esempio canonico di questo è come quasi 50 righe di codice MapReduce per contare le parole in un documento possono essere ridotte a poche righe di Apache Spark (qui mostrato in Scala):

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

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

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

                      .reduceByKey (_ + _)

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

Fornendo collegamenti a linguaggi popolari per l'analisi dei dati come Python e R, oltre a Java e Scala più enterprise-friendly, Apache Spark consente a tutti, dagli sviluppatori di applicazioni ai data scientist, di sfruttare la sua scalabilità e velocità in modo accessibile.

Spark RDD

Al centro di Apache Spark c'è il concetto di Resilient Distributed Dataset (RDD), un'astrazione di programmazione che rappresenta una raccolta immutabile di oggetti che possono essere suddivisi in un cluster di elaborazione. Le operazioni sugli RDD possono anche essere suddivise nel cluster ed eseguite in un processo batch parallelo, portando a un'elaborazione parallela veloce e scalabile.

Gli RDD possono essere creati da semplici file di testo, database SQL, archivi NoSQL (come Cassandra e MongoDB), bucket Amazon S3 e molto altro ancora. Gran parte dell'API Spark Core si basa su questo concetto RDD, che consente la mappa tradizionale e riduce le funzionalità, ma fornisce anche supporto integrato per l'unione di set di dati, filtri, campionamenti e aggregazioni.

Spark viene eseguito in modo distribuito combinando un processo di base del driver che divide un'applicazione Spark in attività e le distribuisce tra molti processi esecutori che svolgono il lavoro. Questi esecutori possono essere ridimensionati in base alle esigenze dell'applicazione.

Spark SQL

Originariamente noto come Shark, Spark SQL è diventato sempre più importante per il progetto Apache Spark. È probabilmente l'interfaccia più comunemente utilizzata dagli sviluppatori di oggi durante la creazione di applicazioni. Spark SQL è focalizzato sull'elaborazione di dati strutturati, utilizzando un approccio dataframe preso in prestito da R e Python (in Pandas). Ma come suggerisce il nome, Spark SQL fornisce anche un'interfaccia conforme a SQL2003 per l'interrogazione dei dati, portando la potenza di Apache Spark agli analisti e agli sviluppatori.

Oltre al supporto SQL standard, Spark SQL fornisce un'interfaccia standard per la lettura e la scrittura su altri datastore tra cui JSON, HDFS, Apache Hive, JDBC, Apache ORC e ​​Apache Parquet, tutti supportati immediatamente. Altri negozi famosi, Apache Cassandra, MongoDB, Apache HBase e molti altri, possono essere utilizzati inserendo connettori separati dall'ecosistema dei pacchetti Spark.

La selezione di alcune colonne da un dataframe è semplice come questa riga:

citiesDF.select ("name", "pop")

Utilizzando l'interfaccia SQL, registriamo il dataframe come una tabella temporanea, dopodiché possiamo eseguire query SQL su di esso:

citiesDF.createOrReplaceTempView ("cities")

spark.sql ("SELEZIONA nome, pop FROM città")

Dietro le quinte, Apache Spark utilizza un ottimizzatore di query chiamato Catalyst che esamina i dati e le query al fine di produrre un piano di query efficiente per la località e il calcolo dei dati che eseguiranno i calcoli richiesti in tutto il cluster. Nell'era di Apache Spark 2.x, l'interfaccia Spark SQL di dataframe e set di dati (essenzialmente un dataframe tipizzato che può essere controllato in fase di compilazione per verificarne la correttezza e sfruttare ulteriori ottimizzazioni di memoria e calcolo in fase di esecuzione) è l'approccio consigliato per lo sviluppo . L'interfaccia RDD è ancora disponibile, ma consigliata solo se le tue esigenze non possono essere soddisfatte all'interno del paradigma Spark SQL.

Spark 2.4 ha introdotto un set di funzioni incorporate di ordine superiore per la manipolazione diretta di array e altri tipi di dati di ordine superiore.

Spark MLlib

Apache Spark include anche librerie per l'applicazione di tecniche di machine learning e analisi dei grafici ai dati su larga scala. Spark MLlib include un framework per la creazione di pipeline di machine learning, che consente una facile implementazione dell'estrazione, delle selezioni e delle trasformazioni delle funzionalità su qualsiasi set di dati strutturato. MLlib viene fornito con implementazioni distribuite di algoritmi di clustering e classificazione come clustering k-means e foreste casuali che possono essere scambiate facilmente dentro e fuori da pipeline personalizzate. I modelli possono essere addestrati dai data scientist in Apache Spark utilizzando R o Python, salvati utilizzando MLlib e quindi importati in una pipeline basata su Java o Scala per l'utilizzo in produzione.

Si noti che mentre Spark MLlib copre l'apprendimento automatico di base tra cui classificazione, regressione, clustering e filtri, non include strutture per la modellazione e l'addestramento di reti neurali profonde (per i dettagli, vedere la recensione di Spark MLlib). Tuttavia, le pipeline di deep learning sono in lavorazione.

Spark GraphX

Spark GraphX ​​viene fornito con una selezione di algoritmi distribuiti per l'elaborazione di strutture grafiche, inclusa un'implementazione del PageRank di Google. Questi algoritmi utilizzano l'approccio RDD di Spark Core alla modellazione dei dati; il pacchetto GraphFrames consente di eseguire operazioni sui grafici sui dataframe, incluso l'utilizzo dell'ottimizzatore Catalyst per le query sui grafici.

Spark Streaming

Spark Streaming è stata una prima aggiunta ad Apache Spark che lo ha aiutato a guadagnare terreno in ambienti che richiedevano un'elaborazione in tempo reale o quasi in tempo reale. In precedenza, l'elaborazione in batch e in streaming nel mondo di Apache Hadoop erano cose separate. Dovresti scrivere il codice MapReduce per le tue esigenze di elaborazione batch e utilizzare qualcosa come Apache Storm per i tuoi requisiti di streaming in tempo reale. Questo ovviamente porta a basi di codice disparate che devono essere mantenute sincronizzate per il dominio dell'applicazione nonostante siano basate su framework completamente diversi, richiedano risorse diverse e coinvolgano diverse preoccupazioni operative per eseguirle.

Spark Streaming ha esteso il concetto di elaborazione batch di Apache Spark in streaming suddividendo il flusso in una serie continua di microbatch, che potrebbero quindi essere manipolati utilizzando l'API Apache Spark. In questo modo, il codice in batch e le operazioni di streaming possono condividere (principalmente) lo stesso codice, in esecuzione sullo stesso framework, riducendo così il sovraccarico sia dello sviluppatore che dell'operatore. Tutti vincono.

Una critica all'approccio Spark Streaming è che il microbatching, in scenari in cui è richiesta una risposta a bassa latenza ai dati in ingresso, potrebbe non essere in grado di eguagliare le prestazioni di altri framework capaci di streaming come Apache Storm, Apache Flink e Apache Apex, che utilizzano tutti un metodo di streaming puro anziché microbatch.

Streaming strutturato

Lo streaming strutturato (aggiunto in Spark 2.x) è per Spark Streaming ciò che Spark SQL era per le API Spark Core: un'API di livello superiore e un'astrazione più semplice per la scrittura di applicazioni. Nel caso di Structure Streaming, l'API di livello superiore consente essenzialmente agli sviluppatori di creare frame di dati e set di dati in streaming infiniti. Risolve anche alcuni punti dolenti molto reali con cui gli utenti hanno lottato nel framework precedente, in particolare per quanto riguarda la gestione delle aggregazioni evento-tempo e la consegna tardiva dei messaggi. Tutte le query sui flussi strutturati passano attraverso l'ottimizzatore di query Catalyst e possono anche essere eseguite in modo interattivo, consentendo agli utenti di eseguire query SQL sui dati in streaming live.

Lo streaming strutturato si basava originariamente sullo schema di microbatching di Spark Streaming per la gestione dei dati in streaming. Ma in Spark 2.3, il team di Apache Spark ha aggiunto una modalità di elaborazione continua a bassa latenza allo streaming strutturato, consentendo di gestire risposte con latenze fino a 1 ms, il che è molto impressionante. A partire da Spark 2.4, l'elaborazione continua è ancora considerata sperimentale. Sebbene lo streaming strutturato sia basato sul motore Spark SQL, lo streaming continuo supporta solo un set limitato di query.

Lo streaming strutturato è il futuro delle applicazioni di streaming con la piattaforma, quindi se stai creando una nuova applicazione di streaming, dovresti usare lo streaming strutturato. Le API precedenti di Spark Streaming continueranno a essere supportate, ma il progetto consiglia di eseguire il porting su Structured Streaming, poiché il nuovo metodo rende la scrittura e la gestione del codice di streaming molto più sopportabili.

Pipeline di deep learning

Apache Spark supporta il deep learning tramite Deep Learning Pipelines. Utilizzando la struttura della pipeline esistente di MLlib, puoi chiamare librerie di deep learning di livello inferiore e costruire classificatori in poche righe di codice, nonché applicare grafici TensorFlow personalizzati o modelli Keras ai dati in arrivo. Questi grafici e modelli possono anche essere registrati come UDF Spark SQL personalizzate (funzioni definite dall'utente) in modo che i modelli di deep learning possano essere applicati ai dati come parte di istruzioni SQL.

Tutorial di Apache Spark

Pronto per immergerti e imparare Apache Spark? Consigliamo vivamente A Neanderthal's Guide to Apache Spark in Python di Evan Heitman, che non solo espone le basi di come funziona Apache Spark in termini relativamente semplici, ma guida anche l'utente attraverso il processo di scrittura di una semplice applicazione Python che fa uso del framework . L'articolo è scritto dal punto di vista di un data scientist, il che ha senso in quanto la scienza dei dati è un mondo in cui i big data e l'apprendimento automatico sono sempre più critici.

Se stai cercando alcuni esempi di Apache Spark per darti un'idea di cosa può fare la piattaforma e come lo fa, controlla Spark di {Esempi}. C'è un sacco di codice di esempio qui per una serie di attività di base che costituiscono gli elementi costitutivi della programmazione Spark, in modo da poter vedere i componenti che compongono le attività più grandi per cui è fatto Apache Spark.

Hai bisogno di andare più a fondo? DZone ha ciò a cui si riferisce modestamente come The Complete Apache Spark Collection, che consiste in una sfilza di utili tutorial su molti argomenti di Apache Spark. Buon apprendimento!