Spark SQL - Guida rapida

Le industrie utilizzano ampiamente Hadoop per analizzare i propri set di dati. Il motivo è che il framework Hadoop si basa su un semplice modello di programmazione (MapReduce) e consente una soluzione di elaborazione scalabile, flessibile, a tolleranza di errore e conveniente. In questo caso, la preoccupazione principale è mantenere la velocità nell'elaborazione di grandi set di dati in termini di tempo di attesa tra le query e tempo di attesa per eseguire il programma.

Spark è stato introdotto da Apache Software Foundation per accelerare il processo del software di calcolo computazionale Hadoop.

Contro una credenza comune, Spark is not a modified version of Hadoope non dipende, in realtà, da Hadoop perché dispone di una propria gestione del cluster. Hadoop è solo uno dei modi per implementare Spark.

Spark utilizza Hadoop in due modi: uno è storage e il secondo è processing. Poiché Spark ha il proprio calcolo di gestione del cluster, utilizza Hadoop solo a scopo di archiviazione.

Apache Spark

Apache Spark è una tecnologia di elaborazione cluster velocissima, progettata per un calcolo veloce. È basato su Hadoop MapReduce ed estende il modello MapReduce per utilizzarlo in modo efficiente per più tipi di calcoli, che includono query interattive e elaborazione del flusso. La caratteristica principale di Spark è la suain-memory cluster computing che aumenta la velocità di elaborazione di un'applicazione.

Spark è progettato per coprire un'ampia gamma di carichi di lavoro come applicazioni batch, algoritmi iterativi, query interattive e streaming. Oltre a supportare tutti questi carichi di lavoro in un rispettivo sistema, riduce l'onere di gestione del mantenimento di strumenti separati.

Evoluzione di Apache Spark

Spark è uno dei sottoprogetti di Hadoop sviluppati nel 2009 nell'AMPLab di UC Berkeley da Matei Zaharia. Era Open Sourced nel 2010 con una licenza BSD. È stato donato alla Fondazione software Apache nel 2013 e ora Apache Spark è diventato un progetto Apache di primo livello da febbraio 2014.

Caratteristiche di Apache Spark

Apache Spark ha le seguenti caratteristiche.

  • Speed- Spark aiuta a eseguire un'applicazione nel cluster Hadoop, fino a 100 volte più veloce in memoria e 10 volte più veloce durante l'esecuzione su disco. Ciò è possibile riducendo il numero di operazioni di lettura / scrittura su disco. Memorizza in memoria i dati di elaborazione intermedia.

  • Supports multiple languages- Spark fornisce API integrate in Java, Scala o Python. Pertanto, puoi scrivere applicazioni in diverse lingue. Spark presenta 80 operatori di alto livello per le query interattive.

  • Advanced Analytics- Spark non supporta solo "Mappa" e "Riduci". Supporta anche query SQL, dati in streaming, machine learning (ML) e algoritmi di grafici.

Spark costruito su Hadoop

Il diagramma seguente mostra tre modi per creare Spark con i componenti Hadoop.

Esistono tre modi per la distribuzione di Spark, come spiegato di seguito.

  • Standalone- La distribuzione autonoma di Spark significa che Spark occupa il posto sopra HDFS (Hadoop Distributed File System) e lo spazio viene allocato esplicitamente per HDFS. Qui, Spark e MapReduce verranno eseguiti fianco a fianco per coprire tutti i processi Spark sul cluster.

  • Hadoop Yarn- La distribuzione di Hadoop Yarn significa, semplicemente, spark funziona su Yarn senza alcuna preinstallazione o accesso root richiesto. Aiuta a integrare Spark nell'ecosistema Hadoop o nello stack Hadoop. Consente ad altri componenti di funzionare in cima allo stack.

  • Spark in MapReduce (SIMR)- Spark in MapReduce viene utilizzato per avviare il lavoro Spark oltre alla distribuzione autonoma. Con SIMR, l'utente può avviare Spark e utilizza la sua shell senza alcun accesso amministrativo.

Componenti di Spark

La figura seguente mostra i diversi componenti di Spark.

Apache Spark Core

Spark Core è il motore di esecuzione generale sottostante per la piattaforma Spark su cui si basano tutte le altre funzionalità. Fornisce elaborazione in memoria e set di dati di riferimento in sistemi di archiviazione esterni.

Spark SQL

Spark SQL è un componente in cima a Spark Core che introduce una nuova astrazione dei dati chiamata SchemaRDD, che fornisce supporto per dati strutturati e semi-strutturati.

Spark Streaming

Spark Streaming sfrutta la capacità di pianificazione rapida di Spark Core per eseguire analisi di streaming. Acquisisce i dati in mini-batch ed esegue trasformazioni RDD (Resilient Distributed Datasets) su questi mini-batch di dati.

MLlib (libreria di machine learning)

MLlib è un framework di machine learning distribuito sopra Spark a causa dell'architettura Spark basata sulla memoria distribuita. Secondo i benchmark, è fatto dagli sviluppatori MLlib contro le implementazioni ALS (Alternating Least Squares). Spark MLlib è nove volte più veloce della versione basata su disco Hadoop diApache Mahout (prima che Mahout acquisisse un'interfaccia Spark).

GraphX

GraphX ​​è un framework di elaborazione di grafici distribuito su Spark. Fornisce un'API per esprimere il calcolo del grafico in grado di modellare i grafici definiti dall'utente utilizzando l'API di astrazione Pregel. Fornisce inoltre un runtime ottimizzato per questa astrazione.

Set di dati distribuiti resilienti

Resilient Distributed Datasets (RDD) è una struttura dati fondamentale di Spark. È una raccolta distribuita immutabile di oggetti. Ogni set di dati in RDD è suddiviso in partizioni logiche, che possono essere calcolate su diversi nodi del cluster. Gli RDD possono contenere qualsiasi tipo di oggetti Python, Java o Scala, comprese le classi definite dall'utente.

Formalmente, un RDD è una raccolta di record partizionata di sola lettura. Gli RDD possono essere creati tramite operazioni deterministiche sui dati su una memoria stabile o su altri RDD. RDD è una raccolta di elementi a tolleranza di errore su cui è possibile operare in parallelo.

Esistono due modi per creare RDD: parallelizing una raccolta esistente nel programma del driver o referencing a dataset in un sistema di archiviazione esterno, come un file system condiviso, HDFS, HBase o qualsiasi origine dati che offra un formato di input Hadoop.

Spark fa uso del concetto di RDD per ottenere operazioni MapReduce più veloci ed efficienti. Discutiamo prima di come avvengono le operazioni di MapReduce e perché non sono così efficienti.

La condivisione dei dati è lenta in MapReduce

MapReduce è ampiamente adottato per l'elaborazione e la generazione di grandi set di dati con un algoritmo parallelo e distribuito su un cluster. Consente agli utenti di scrivere calcoli paralleli, utilizzando una serie di operatori di alto livello, senza doversi preoccupare della distribuzione del lavoro e della tolleranza ai guasti.

Sfortunatamente, nella maggior parte dei framework attuali, l'unico modo per riutilizzare i dati tra i calcoli (Es: tra due lavori MapReduce) è scriverli su un sistema di archiviazione stabile esterno (Es: HDFS). Sebbene questo framework fornisca numerose astrazioni per accedere alle risorse di calcolo di un cluster, gli utenti vogliono ancora di più.

Tutti e due Iterative e Interactivele applicazioni richiedono una condivisione dei dati più rapida tra lavori paralleli. La condivisione dei dati è lenta in MapReduce a causa direplication, serialization, e disk IO. Per quanto riguarda il sistema di archiviazione, la maggior parte delle applicazioni Hadoop trascorrono più del 90% del tempo in operazioni di lettura-scrittura HDFS.

Operazioni iterative su MapReduce

Riutilizza i risultati intermedi in più calcoli in applicazioni in più fasi. La figura seguente spiega come funziona il framework corrente, mentre si eseguono le operazioni iterative su MapReduce. Ciò comporta notevoli sovraccarichi a causa della replica dei dati, dell'I / O del disco e della serializzazione, che rallentano il sistema.

Operazioni interattive su MapReduce

L'utente esegue query ad-hoc sullo stesso sottoinsieme di dati. Ogni query eseguirà l'I / O del disco sulla memoria stabile, che può dominare il tempo di esecuzione dell'applicazione.

La figura seguente spiega come funziona il framework corrente durante l'esecuzione delle query interattive su MapReduce.

Condivisione dei dati utilizzando Spark RDD

La condivisione dei dati è lenta in MapReduce a causa di replication, serialization, e disk IO. Nella maggior parte delle applicazioni Hadoop, trascorrono più del 90% del tempo in operazioni di lettura e scrittura HDFS.

Riconoscendo questo problema, i ricercatori hanno sviluppato un framework specializzato chiamato Apache Spark. L'idea chiave della scintilla èResiliente Ddistribuito Datasets (RDD); supporta il calcolo dell'elaborazione in memoria. Ciò significa che memorizza lo stato della memoria come un oggetto tra i lavori e l'oggetto è condivisibile tra questi lavori. La condivisione dei dati in memoria è da 10 a 100 volte più veloce della rete e del disco.

Proviamo ora a scoprire come avvengono le operazioni iterative e interattive in Spark RDD.

Operazioni iterative su Spark RDD

L'illustrazione riportata di seguito mostra le operazioni iterative su Spark RDD. Memorizzerà i risultati intermedi in una memoria distribuita invece che nell'archiviazione stabile (disco) e renderà il sistema più veloce.

Note - Se la memoria distribuita (RAM) è sufficiente per memorizzare i risultati intermedi (stato del lavoro), memorizzerà quei risultati sul disco

Operazioni interattive su Spark RDD

Questa illustrazione mostra le operazioni interattive su Spark RDD. Se diverse query vengono eseguite ripetutamente sullo stesso set di dati, questi particolari dati possono essere conservati in memoria per tempi di esecuzione migliori.

Per impostazione predefinita, ogni RDD trasformato può essere ricalcolato ogni volta che si esegue un'azione su di esso. Tuttavia, potresti anchepersistun RDD in memoria, nel qual caso Spark manterrà gli elementi nel cluster per un accesso molto più rapido, la prossima volta che lo interrogherai. È inoltre disponibile il supporto per la persistenza di RDD su disco o la replica su più nodi.

Spark è il sottoprogetto di Hadoop. Pertanto, è meglio installare Spark in un sistema basato su Linux. I seguenti passaggi mostrano come installare Apache Spark.

Passaggio 1: verifica dell'installazione di Java

L'installazione di Java è una delle cose obbligatorie nell'installazione di Spark. Prova il seguente comando per verificare la versione JAVA.

$java -version

Se Java è già installato sul tuo sistema, puoi vedere la seguente risposta:

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

Se non hai Java installato sul tuo sistema, installa Java prima di procedere al passaggio successivo.

Passaggio 2: verifica dell'installazione di Scala

Dovresti usare il linguaggio Scala per implementare Spark. Quindi verifichiamo l'installazione di Scala usando il seguente comando.

$scala -version

Se Scala è già installato sul tuo sistema, vedrai la seguente risposta:

Scala code runner version 2.11.6 -- Copyright 2002-2013, LAMP/EPFL

Nel caso in cui non hai Scala installato sul tuo sistema, procedi al passaggio successivo per l'installazione di Scala.

Passaggio 3: download di Scala

Scarica l'ultima versione di Scala visitando il seguente link Download Scala . Per questo tutorial, stiamo usando la versione scala-2.11.6. Dopo il download, troverai il file tar di Scala nella cartella di download.

Passaggio 4: installazione di Scala

Seguire i passaggi indicati di seguito per l'installazione di Scala.

Estrai il file tar di Scala

Digita il seguente comando per estrarre il file tar Scala.

$ tar xvf scala-2.11.6.tgz

Spostare i file del software Scala

Utilizzare i seguenti comandi per spostare i file del software Scala nella rispettiva directory (/usr/local/scala).

$ su –
Password:
# cd /home/Hadoop/Downloads/
# mv scala-2.11.6 /usr/local/scala
# exit

Imposta PATH per Scala

Utilizzare il seguente comando per impostare PATH per Scala.

$ export PATH = $PATH:/usr/local/scala/bin

Verifica dell'installazione di Scala

Dopo l'installazione, è meglio verificarlo. Utilizzare il seguente comando per verificare l'installazione di Scala.

$scala -version

Se Scala è già installato sul tuo sistema, vedrai la seguente risposta:

Scala code runner version 2.11.6 -- Copyright 2002-2013, LAMP/EPFL

Passaggio 5: download di Apache Spark

Scarica l'ultima versione di Spark visitando il seguente link Download Spark . Per questo tutorial, stiamo usandospark-1.3.1-bin-hadoop2.6versione. Dopo averlo scaricato, troverai il file tar Spark nella cartella di download.

Passaggio 6: installazione di Spark

Segui i passaggi indicati di seguito per l'installazione di Spark.

Estrazione del catrame di scintilla

Il seguente comando per estrarre il file spark tar.

$ tar xvf spark-1.3.1-bin-hadoop2.6.tgz

Spostamento dei file del software Spark

I seguenti comandi per spostare i file del software Spark nella rispettiva directory (/usr/local/spark).

$ su –
Password:
# cd /home/Hadoop/Downloads/
# mv spark-1.3.1-bin-hadoop2.6 /usr/local/spark
# exit

Configurazione dell'ambiente per Spark

Aggiungi la riga seguente a ~/.bashrcfile. Significa aggiungere la posizione, in cui si trova il file del software spark alla variabile PATH.

export PATH = $PATH:/usr/local/spark/bin

Utilizzare il seguente comando per reperire il file ~ / .bashrc.

$ source ~/.bashrc

Passaggio 7: verifica dell'installazione di Spark

Scrivi il seguente comando per aprire la shell Spark.

$spark-shell

Se spark è installato correttamente, troverai il seguente output.

Spark assembly has been built with Hive, including Datanucleus jars on classpath
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
15/06/04 15:25:22 INFO SecurityManager: Changing view acls to: hadoop
15/06/04 15:25:22 INFO SecurityManager: Changing modify acls to: hadoop
disabled; ui acls disabled; users with view permissions: Set(hadoop); users with modify permissions: Set(hadoop)
15/06/04 15:25:22 INFO HttpServer: Starting HTTP Server
15/06/04 15:25:23 INFO Utils: Successfully started service 'HTTP class server' on port 43292.
Welcome to
    ____             __
   / __/__ ___ _____/ /__
   _\ \/ _ \/ _ `/ __/ '_/
   /___/ .__/\_,_/_/ /_/\_\ version 1.4.0
      /_/
Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_71)
Type in expressions to have them evaluated.
Spark context available as sc
scala>

Spark introduce un modulo di programmazione per l'elaborazione dei dati strutturati chiamato Spark SQL. Fornisce un'astrazione di programmazione chiamata DataFrame e può fungere da motore di query SQL distribuito.

Caratteristiche di Spark SQL

Le seguenti sono le funzionalità di Spark SQL:

  • Integrated- Combina perfettamente le query SQL con i programmi Spark. Spark SQL ti consente di eseguire query sui dati strutturati come un set di dati distribuito (RDD) in Spark, con API integrate in Python, Scala e Java. Questa stretta integrazione semplifica l'esecuzione di query SQL insieme a complessi algoritmi analitici.

  • Unified Data Access- Carica ed esegui query sui dati da una varietà di origini. Gli Schema-RDD forniscono un'unica interfaccia per lavorare in modo efficiente con i dati strutturati, comprese le tabelle Apache Hive, i file parquet e i file JSON.

  • Hive Compatibility- Esegui query Hive non modificate sui magazzini esistenti. Spark SQL riutilizza il frontend Hive e MetaStore, offrendoti piena compatibilità con i dati, le query e le UDF esistenti di Hive. Installalo semplicemente insieme a Hive.

  • Standard Connectivity- Connessione tramite JDBC o ODBC. Spark SQL include una modalità server con connettività JDBC e ODBC standard del settore.

  • Scalability- Utilizza lo stesso motore per query sia interattive che lunghe. Spark SQL sfrutta il modello RDD per supportare la tolleranza agli errori di query intermedie, consentendo la scalabilità anche a lavori di grandi dimensioni. Non preoccuparti di utilizzare un motore diverso per i dati storici.

Spark SQL Architecture

La figura seguente spiega l'architettura di Spark SQL:

Questa architettura contiene tre livelli, ovvero Language API, Schema RDD e Data Sources.

  • Language API- Spark è compatibile con diversi linguaggi e Spark SQL. È anche supportato da questi linguaggi: API (python, scala, java, HiveQL).

  • Schema RDD- Spark Core è progettato con una struttura dati speciale chiamata RDD. In genere, Spark SQL funziona su schemi, tabelle e record. Pertanto, possiamo usare lo Schema RDD come tabella temporanea. Possiamo chiamare questo schema RDD come data frame.

  • Data Sources- Di solito l'origine dati per Spark-core è un file di testo, un file Avro, ecc. Tuttavia, le origini dati per Spark SQL sono diverse. Quelli sono file Parquet, documento JSON, tabelle HIVE e database Cassandra.

Discuteremo di più su questi nei capitoli successivi.

Un DataFrame è una raccolta distribuita di dati, organizzata in colonne denominate. Concettualmente, è equivalente a tabelle relazionali con buone tecniche di ottimizzazione.

Un DataFrame può essere costruito da una matrice di origini diverse come tabelle Hive, file di dati strutturati, database esterni o RDD esistenti. Questa API è stata progettata per applicazioni moderne di Big Data e data science prendendo ispirazioneDataFrame in R Programming e Pandas in Python.

Caratteristiche di DataFrame

Ecco una serie di alcune caratteristiche caratteristiche di DataFrame:

  • Capacità di elaborare i dati nella dimensione da Kilobyte a Petabyte su un cluster a nodo singolo in cluster di grandi dimensioni.

  • Supporta diversi formati di dati (Avro, csv, ricerca elastica e Cassandra) e sistemi di archiviazione (HDFS, tabelle HIVE, mysql, ecc.).

  • Ottimizzazione dello stato dell'arte e generazione di codice tramite l'ottimizzatore Spark SQL Catalyst (framework di trasformazione dell'albero).

  • Può essere facilmente integrato con tutti gli strumenti e framework di Big Data tramite Spark-Core.

  • Fornisce API per la programmazione Python, Java, Scala e R.

SQLContext

SQLContext è una classe e viene utilizzata per inizializzare le funzionalità di Spark SQL. SparkContext classe oggetto (sc) è necessario per inizializzare l'oggetto classe SQLContext.

Il comando seguente viene utilizzato per inizializzare SparkContext tramite spark-shell.

$ spark-shell

Per impostazione predefinita, l'oggetto SparkContext viene inizializzato con il nome sc quando parte la scintilla.

Utilizzare il comando seguente per creare SQLContext.

scala> val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

Esempio

Consideriamo un esempio di record dei dipendenti in un file JSON denominato employee.json. Utilizzare i seguenti comandi per creare un DataFrame (df) e leggere un documento JSON denominatoemployee.json con il seguente contenuto.

employee.json - Posiziona questo file nella directory in cui si trova il file scala> il puntatore si trova.

{
   {"id" : "1201", "name" : "satish", "age" : "25"}
   {"id" : "1202", "name" : "krishna", "age" : "28"}
   {"id" : "1203", "name" : "amith", "age" : "39"}
   {"id" : "1204", "name" : "javed", "age" : "23"}
   {"id" : "1205", "name" : "prudvi", "age" : "23"}
}

Operazioni DataFrame

DataFrame fornisce un linguaggio specifico del dominio per la manipolazione dei dati strutturati. Qui, includiamo alcuni esempi di base di elaborazione di dati strutturati utilizzando DataFrame.

Seguire i passaggi indicati di seguito per eseguire le operazioni DataFrame -

Leggi il documento JSON

Innanzitutto, dobbiamo leggere il documento JSON. Sulla base di ciò, genera un DataFrame denominato (dfs).

Utilizza il seguente comando per leggere il documento JSON denominato employee.json. I dati vengono visualizzati come una tabella con i campi: id, nome ed età.

scala> val dfs = sqlContext.read.json("employee.json")

Output - I nomi dei campi vengono presi automaticamente da employee.json.

dfs: org.apache.spark.sql.DataFrame = [age: string, id: string, name: string]

Mostra i dati

Se vuoi vedere i dati nel DataFrame, usa il seguente comando.

scala> dfs.show()

Output - Puoi vedere i dati dei dipendenti in formato tabulare.

<console>:22, took 0.052610 s
+----+------+--------+
|age | id   |  name  |
+----+------+--------+
| 25 | 1201 | satish |
| 28 | 1202 | krishna|
| 39 | 1203 | amith  |
| 23 | 1204 | javed  |
| 23 | 1205 | prudvi |
+----+------+--------+

Usa il metodo printSchema

Se vuoi vedere la struttura (schema) del DataFrame, usa il seguente comando.

scala> dfs.printSchema()

Output

root
   |-- age: string (nullable = true)
   |-- id: string (nullable = true)
   |-- name: string (nullable = true)

Usa metodo di selezione

Usa il seguente comando per recuperare name-colonna tra tre colonne dal DataFrame.

scala> dfs.select("name").show()

Output - Puoi vedere i valori di name colonna.

<console>:22, took 0.044023 s
+--------+
|  name  |
+--------+
| satish |
| krishna|
| amith  |
| javed  |
| prudvi |
+--------+

Usa filtro età

Utilizzare il seguente comando per trovare i dipendenti la cui età è maggiore di 23 (età> 23).

scala> dfs.filter(dfs("age") > 23).show()

Output

<console>:22, took 0.078670 s
+----+------+--------+
|age | id   | name   |
+----+------+--------+
| 25 | 1201 | satish |
| 28 | 1202 | krishna|
| 39 | 1203 | amith  |
+----+------+--------+

Usa il metodo groupBy

Utilizzare il seguente comando per contare il numero di dipendenti che hanno la stessa età.

scala> dfs.groupBy("age").count().show()

Output - due dipendenti hanno 23 anni.

<console>:22, took 5.196091 s
+----+-----+
|age |count|
+----+-----+
| 23 |  2  |
| 25 |  1  |
| 28 |  1  |
| 39 |  1  |
+----+-----+

Esecuzione di query SQL a livello di programmazione

Un SQLContext consente alle applicazioni di eseguire query SQL a livello di codice durante l'esecuzione di funzioni SQL e restituisce il risultato come DataFrame.

Generalmente, in background, SparkSQL supporta due diversi metodi per convertire RDD esistenti in DataFrame:

Sr. No Metodi e descrizione
1 Deduzione dello schema utilizzando la riflessione

Questo metodo utilizza la riflessione per generare lo schema di un RDD che contiene tipi specifici di oggetti.

2 Specifica dello schema a livello di codice

Il secondo metodo per creare DataFrame è tramite l'interfaccia programmatica che consente di costruire uno schema e quindi applicarlo a un RDD esistente.

Un'interfaccia DataFrame consente a diverse DataSource di lavorare su Spark SQL. È un tavolo temporaneo e può essere utilizzato come un normale RDD. La registrazione di un DataFrame come tabella consente di eseguire query SQL sui suoi dati.

In questo capitolo, descriveremo i metodi generali per caricare e salvare i dati utilizzando diverse origini dati Spark. Successivamente, discuteremo in dettaglio le opzioni specifiche disponibili per le origini dati integrate.

Esistono diversi tipi di origini dati disponibili in SparkSQL, alcune delle quali sono elencate di seguito:

Sr. No Origine dei dati
1 Set di dati JSON

Spark SQL può acquisire automaticamente lo schema di un set di dati JSON e caricarlo come DataFrame.

2 Tabelle dell'alveare

Hive viene fornito in bundle con la libreria Spark come HiveContext, che eredita da SQLContext.

3 File per parquet

Il parquet è un formato colonnare, supportato da molti sistemi di elaborazione dati.