Apache Spark ha la sua base architettonica nel resilient Distributed dataset (RDD), un multiset di sola lettura di elementi di dati distribuiti su un cluster di macchine, che viene mantenuto in modo fault-tolerant. L’API Dataframe è stata rilasciata come astrazione sopra l’RDD, seguita dall’API Dataset. In Spark 1.x, l’RDD era l’interfaccia di programmazione delle applicazioni primaria (API), ma a partire da Spark 2.x l’uso dell’API Dataset è incoraggiato anche se l’API RDD non è deprecata. La tecnologia RDD è ancora alla base dell’API Dataset.,
Spark e i suoi RDD sono stati sviluppati nel 2012 in risposta alle limitazioni del paradigma di calcolo cluster MapReduce, che forza una particolare struttura di flusso di dati lineare su programmi distribuiti: i programmi MapReduce leggono i dati di input dal disco, mappano una funzione attraverso i dati, riducono i risultati della mappa e memorizzano i risultati di riduzione sul disco. Gli RDD di Spark funzionano come un working set per programmi distribuiti che offre una forma (deliberatamente) limitata di memoria condivisa distribuita.,
Spark facilita l’implementazione di entrambi gli algoritmi iterativi, che visitano il loro set di dati più volte in un ciclo, e l’analisi dei dati interattiva / esplorativa, cioè l’interrogazione ripetuta in stile database dei dati. La latenza di tali applicazioni può essere ridotta di diversi ordini di grandezza rispetto all’implementazione di Apache Hadoop MapReduce.Tra la classe di algoritmi iterativi ci sono gli algoritmi di allenamento per i sistemi di apprendimento automatico, che hanno costituito l’impulso iniziale per lo sviluppo di Apache Spark.
Apache Spark richiede un gestore di cluster e un sistema di storage distribuito., Per la gestione del cluster, Spark supporta standalone (cluster Spark nativo, in cui è possibile avviare un cluster manualmente o utilizzare gli script di avvio forniti dal pacchetto di installazione. È anche possibile eseguire questi demoni su una singola macchina per il test), Hadoop YARN, Apache Mesos o Kubernetes. Per lo storage distribuito, Spark può interfacciarsi con una vasta gamma, tra cui Alluxio, Hadoop Distributed File System (HDFS), MapR File System (MapR-FS), Cassandra, OpenStack Swift, Amazon S3, Kudu, Lustre file system, o una soluzione personalizzata può essere implementato., Spark supporta anche una modalità locale pseudo-distribuita, solitamente utilizzata solo per scopi di sviluppo o test, in cui non è richiesta l’archiviazione distribuita e il file system locale può essere utilizzato al suo posto; in tale scenario, Spark viene eseguito su una singola macchina con un esecutore per core della CPU.
Spark CoreEdit
Spark Core è il fondamento del progetto complessivo. Fornisce attività distribuite dispacciamento, la pianificazione, e le funzionalità di I/O di base, esposti attraverso un’interfaccia di programmazione delle applicazioni (per Java, Python, Scala, .,NET e R) centrato sull’astrazione RDD (l’API Java è disponibile per altri linguaggi JVM, ma è anche utilizzabile per altri linguaggi non JVM che possono connettersi alla JVM, come Julia). Questa interfaccia rispecchia un modello di programmazione funzionale/di ordine superiore: un programma “driver” richiama operazioni parallele come map, filter o reduce su un RDD passando una funzione a Spark, che quindi pianifica l’esecuzione della funzione in parallelo sul cluster. Queste operazioni, e quelle aggiuntive come join, prendono RDD come input e producono nuovi RDD., Gli RDD sono immutabili e le loro operazioni sono pigre; la tolleranza ai guasti si ottiene tenendo traccia del “lineage” di ciascun RDD (la sequenza di operazioni che lo ha prodotto) in modo che possa essere ricostruito in caso di perdita di dati. RDDs può contenere qualsiasi tipo di Python,. NET, Java, o oggetti Scala.
Oltre allo stile funzionale di programmazione orientato a RDD, Spark fornisce due forme limitate di variabili condivise: le variabili broadcast fanno riferimento a dati di sola lettura che devono essere disponibili su tutti i nodi, mentre gli accumulatori possono essere utilizzati per programmare riduzioni in uno stile imperativo.,
Un tipico esempio di programmazione funzionale RDD-centric è il seguente programma Scala che calcola le frequenze di tutte le parole che si verificano in un insieme di file di testo e stampa quelli più comuni. Ogni map, flatMap (una variante di map) e reduceByKey prende una funzione anonima che esegue una semplice operazione su un singolo elemento di dati (o una coppia di elementi) e applica il suo argomento per trasformare un RDD in un nuovo RDD.,
Spark SQLEdit
Spark SQL è un componente di Spark Core che ha introdotto un’astrazione dei dati chiamata DataFrames, che fornisce supporto per dati strutturati e semi-strutturati. Spark SQL fornisce un linguaggio specifico del dominio (DSL) per manipolare i dataframe in Scala, Java, Python o .NET. Fornisce anche supporto per il linguaggio SQL, con interfacce a riga di comando e server ODBC/JDBC. Sebbene i dataframe non dispongano del controllo del tipo in fase di compilazione offerto dagli RDD, a partire da Spark 2.0, il set di dati fortemente tipizzato è pienamente supportato anche da Spark SQL.,
Spark StreamingEdit
Spark Streaming utilizza la capacità di pianificazione veloce di Spark Core per eseguire analisi di streaming. Si ingerisce i dati in mini-batch ed esegue trasformazioni RDD su quei mini-batch di dati. Questo design consente di utilizzare lo stesso set di codice dell’applicazione scritto per l’analisi batch nell’analisi di streaming, facilitando così la facile implementazione dell’architettura lambda. Tuttavia, questa convenienza viene fornito con la pena di latenza pari alla durata mini-batch., Altri motori di dati di streaming che elaborano evento per evento piuttosto che in mini-batch includono Storm e il componente di streaming di Flink. Spark Streaming ha il supporto integrato per consumare da Kafka, Flume, Twitter, ZeroMQ, Kinesis e socket TCP/IP.
In Spark 2.x, una tecnologia separata basata su set di dati, chiamato Structured Streaming, che ha un’interfaccia di livello superiore è anche fornito per supportare lo streaming.
Spark può essere distribuito in un tradizionale data center locale e nel cloud.,
MLlib Macchina di Apprendimento LibraryEdit
Scintilla MLlib viene distribuita una macchina-quadro di apprendimento in cima Scintilla Core che, dovuto in gran parte a memoria distribuita basato su Scintilla architettura, è nove volte più veloce basato su disco attuazione utilizzato da Apache Mahout (secondo i parametri di riferimento fatto dal MLlib sviluppatori contro l’alternarsi dei minimi quadrati (SLA) implementazioni, e prima di Mahout stessa guadagnato una Scintilla di interfaccia), e scale meglio di Vowpal Wabbit.,, Gradiente-Boosted Albero
GraphXEdit
GraphX è distribuito grafico-elaborazione del quadro su Apache Scintilla., Poiché è basato su RDD, che sono immutabili, i grafici sono immutabili e quindi GraphX non è adatto per i grafici che devono essere aggiornati, per non parlare di un modo transazionale come un database grafico. GraphX fornisce due API separate per l’implementazione di algoritmi massicciamente paralleli (come PageRank): un’astrazione Pregel e un’API in stile MapReduce più generale. A differenza del suo predecessore Bagel, che è stato formalmente deprecato in Spark 1.6, GraphX ha il pieno supporto per i grafici delle proprietà (grafici in cui le proprietà possono essere associate a bordi e vertici).,
GraphX può essere visto come la versione Spark in memoria di Apache Giraph, che utilizzava Hadoop MapReduce basato su disco.
Come Apache Spark, GraphX inizialmente è stato avviato come progetto di ricerca presso l’AMPLab e Databricks di UC Berkeley, e successivamente è stato donato alla Apache Software Foundation e al progetto Spark.
Leave a Reply