Apache Spark Optimisation Techniques and Performance Tuning

Di Chandan Gaur|Big Data Engineering|05,Oct,2020

Che cos’è Apache Spark?

Apache, nel 2012, descrisse la base Resilient Distributed Dataset (RDD in Apache Spark) con set di dati distribuiti di sola lettura su cluster distribuiti e lo chiamò Apache Spark. Successivamente, introducono l’API Dataset e quindi le API Dataframe per lo streaming batch e strutturato dei dati. Questo articolo elenca le migliori tecniche di ottimizzazione di Apache Spark.

Apache Spark è una piattaforma di calcolo cluster veloce sviluppata per eseguire più calcoli e stream processing. Spark è in grado di gestire un’ampia varietà di carichi di lavoro rispetto ai sistemi tradizionali che richiedono l’esecuzione e il supporto di più sistemi. Le pipeline di analisi dei dati sono facilitate da Spark in combinazione con diversi tipi di elaborazione necessari per la produzione. Apache Spark è stato creato per operare con un gestore di cluster esterno come YARN o il suo gestore stand-alone.

Caratteristiche di Apache Spark

Alcune caratteristiche di Apache Spark includono:-

  • Piattaforma unificata per la scrittura di applicazioni big data.
  • Facilità di sviluppo.
  • Progettato per essere altamente accessibile.
  • Spark può funzionare in modo indipendente. Così dà flessibilità.
  • Costo efficiente.

XenonStack fornisce servizi e soluzioni di analisi per l’acquisizione, l’elaborazione e l’analisi dei flussi di dati in tempo reale e in streaming in modo rapido ed efficiente per l’Internet of Things, il monitoraggio, la manutenzione preventiva e predittiva.

Dall’articolo, Streaming e servizi di analisi in tempo reale

Capire come funziona Apache Spark Optimization?

Per capire come funziona l’ottimizzazione di Apache Spark, devi prima capire la sua architettura e nella sezione successiva, elaboreremo lo stesso.

L’architettura di Apache Spark

L’architettura runtime di Spark è composta da tre parti:

Driver Spark (processo master)

Il driver Spark converte i programmi in attività e pianifica le attività per gli Esecutori. L’utilità di pianificazione è la parte del driver e aiuta a distribuire le attività agli esecutori.

Spark Cluster Manager

Un cluster manager è il nucleo in Spark che permette di lanciare esecutori e talvolta i driver possono essere lanciati da esso anche. Spark Scheduler pianifica le azioni e i lavori nell’applicazione Spark in modo FIFO su cluster manager stesso. Si dovrebbe anche leggere su Apache Airflow.

Esecutori (processi slave)

Gli esecutori sono le singole entità su cui viene eseguito il singolo compito del lavoro. Gli esecutori verranno sempre eseguiti fino al ciclo di vita di un’applicazione spark una volta avviati. Gli esecutori falliti non interrompono l’esecuzione del processo spark.

RDD (Resilient Distributed Dataset)

Un RDD è una raccolta distribuita di set di dati immutabili sui nodi distribuiti del cluster. Un RDD è partizionato in una o più partizioni. RDD è il nucleo di spark come la loro distribuzione tra i vari nodi del cluster che sfrutta la località dei dati. Per ottenere il parallelismo all’interno dell’applicazione, le partizioni sono le unità per esso. Le trasformazioni di ripartizione o coalescenza possono aiutare a mantenere il numero di partizioni. L’accesso ai dati è ottimizzato utilizzando RDD shuffling. Poiché Spark è vicino ai dati, invia i dati attraverso vari nodi e crea le partizioni richieste secondo necessità.

DAG (Directed Acyclic Graph)

Spark tende a generare un grafico operatore quando inseriamo il nostro codice in Spark console. Quando un’azione viene attivata per Spark RDD, Spark invia quel grafico al DAGScheduler. Quindi divide quei grafici degli operatori in fasi dell’attività all’interno di DAGScheduler. Ogni passaggio può contenere lavori basati su diverse partizioni dei dati in entrata. Il DAGScheduler pipeline quei singoli grafici operatore insieme. Per esempio, Mappa operatore grafici programma per un singolo stadio e queste fasi passano al. Utilità di pianificazione in cluster manager per la loro esecuzione. Questo è il compito del Lavoro o degli Esecutori per eseguire queste attività sullo slave.

Elaborazione distribuita che utilizza le partizioni in modo efficiente

L’aumento del numero di esecutori sui cluster aumenta anche il parallelismo nell’elaborazione del lavoro Spark. Ma per questo, bisogna avere informazioni adeguate su come quei dati sarebbero distribuiti tra quegli esecutori tramite il partizionamento. RDD è utile per questo caso con traffico trascurabile per il miscuglio di dati tra questi esecutori. Si può personalizzare il partizionamento per la coppia RDD (RDD con coppie chiave-valore). Spark assicura che set di chiavi apparirà sempre insieme nello stesso nodo perché non c’è alcun controllo esplicito in questo caso.

Apache Spark security aiuta l’autenticazione tramite un segreto condiviso. L’autenticazione Spark è il parametro di configurazione attraverso il quale è possibile configurare l’autenticazione. È il parametro che controlla se i protocolli della comunicazione spark stanno eseguendo l’autenticazione utilizzando un segreto condiviso o meno.

Dall’articolo, Apache Spark Security

Errori da evitare durante la scrittura di applicazioni Spark

reduceByKey o groupByKey

Sia groupByKey che reduceByKey producono la stessa risposta ma il concetto per produrre risultati è diverso. reduceByKey è più adatto per set di dati di grandi dimensioni perché in Spark combina l’output con una chiave condivisa per ogni partizione prima di mescolare i dati. Mentre dall’altra parte, groupByKey mescola tutte le coppie chiave-valore. GroupByKey provoca mischie inutili e il trasferimento di dati sulla rete.

Mantenere la dimensione richiesta dei blocchi shuffle

Per impostazione predefinita, il blocco shuffle Spark non può superare i 2 GB. L’uso migliore è quello di aumentare le partizioni e ridurre la sua capacità a ~128 MB per partizione che ridurrà la dimensione del blocco casuale. Possiamo utilizzare la ripartizione o la fusione in applicazioni regolari. Grandi partizioni rendono il processo lento a causa di un limite di 2 GB, e poche partizioni non consentono di scalare il lavoro e raggiungere il parallelismo.

Formati di file e delimitatori

Scegliere i formati di file giusti per ogni specifica relativa ai dati è un mal di testa. È necessario scegliere saggiamente il formato dei dati per i tipi di ingestione, il tipo intermedio e il tipo di output finale. Possiamo anche classificare i formati di file di dati per ogni tipo in diversi modi, come possiamo usare il formato di file AVRO per la memorizzazione dei dati multimediali come Avro è meglio ottimizzato per i dati binari di Parquet. Parquet può essere utilizzato per la memorizzazione di informazioni di metadati in quanto è altamente compresso.

Piccoli file di dati

La trasmissione è una tecnica per caricare piccoli file di dati o set di dati in blocchi di memoria in modo che possano essere uniti a set di dati più massicci con meno sovraccarico di dati mischiati. Ad esempio, possiamo memorizzare piccoli file di dati in n numero di blocchi e file di dati di grandi dimensioni possono essere uniti a questi blocchi di dati in futuro come file di dati di grandi dimensioni possono essere distribuiti tra questi blocchi in modo parallelo.

Nessun monitoraggio delle fasi di lavoro

DAG è una struttura dati utilizzata in Spark che descrive varie fasi di attività in formato grafico. La maggior parte degli sviluppatori scrive ed esegue il codice, ma il monitoraggio delle attività di lavoro è essenziale. Questo monitoraggio si ottiene meglio gestendo il DAG e riducendo le fasi. Il lavoro con 20 passaggi è prolungato rispetto a un lavoro con 3-4 fasi.

ByKey, ripartition o qualsiasi altra operazione che innesca lo shuffle

La maggior parte delle volte dobbiamo evitare lo shuffle il più possibile come lo shuffle di dati su molti, e talvolta diventa molto complesso ottenere la scalabilità da questi shuffle. GroupByKey può essere una risorsa preziosa, ma la sua necessità deve essere descritta prima.

Reinforcement Learning

Reinforcement Learning non è solo il concetto per ottenere un migliore ambiente di apprendimento automatico, ma anche per elaborare le decisioni in un modo migliore. È necessario applicare l’apprendimento per rinforzo profondo in spark se il modello di transizione e il modello di ricompensa sono costruiti correttamente su set di dati e anche gli agenti sono in grado di stimare i risultati.

Fattori e tecniche di ottimizzazione di Apache Spark

Una delle migliori caratteristiche di Apache Spark optimization è che aiuta per i calcoli dei dati in memoria. Il collo di bottiglia per questi calcoli di ottimizzazione spark può essere CPU, memoria o qualsiasi risorsa nel cluster. In questi casi può verificarsi la necessità di serializzare i dati, ridurre la memoria. Questi fattori per la scintilla di ottimizzazione, se usato correttamente, può–

  • Eliminare il processo di lavoro
  • Correzione motore di esecuzione
  • Migliora la performance tempo la gestione delle risorse

13 Semplici Tecniche per Apache Scintilla di Ottimizzazione

Accumulatori sono variabili globali per gli esecutori che possono essere aggiunti attraverso un associativa e commutativa operazione. Può, quindi, essere efficiente in parallelo. Gli accumulatori possono essere utilizzati per implementare contatori (come in Map Reduce) o un’altra attività come il monitoraggio delle chiamate API.

Per impostazione predefinita, Spark supporta accumulatori numerici, ma i programmatori hanno il vantaggio di aggiungere il supporto per nuovi tipi. Spark assicura che l’aggiornamento di ogni attività verrà applicato una sola volta alle variabili dell’accumulatore. Durante le trasformazioni, gli utenti dovrebbero essere consapevoli dell’aggiornamento di ogni attività in quanto possono essere applicati più di una volta se le fasi del lavoro vengono rieseguite.

Prestazioni di bucketing Hive

Risultati di bucketing con un numero fisso di file poiché specifichiamo il numero di bucket con un bucket. Hive ha preso il campo, calcola l’hash e assegna un record a quel particolare bucket. Il bucketing è più stabile quando il campo ha una cardinalità elevata, un’elaborazione dei dati di grandi dimensioni e i record sono distribuiti uniformemente tra tutti i bucket, mentre il partizionamento funziona quando la cardinalità del campo di partizionamento è bassa.

Il bucketing riduce il sovraccarico dei file di ordinamento. Ad esempio, se stiamo unendo due tabelle che hanno un numero uguale di bucket, spark unisce i dati direttamente come chiavi già ordinate bucket. Il numero di file bucket può essere calcolato come più partizioni in più bucket.

Ottimizzazione pushdown predicato

Pushdown predicato è una tecnica per elaborare solo i dati richiesti. I predicati possono essere applicati a SparkSQL definendo i filtri in condizioni where. Usando il comando explain to query possiamo controllare le fasi di elaborazione delle query. Se il piano di query contiene PushedFilter, la query è ottimizzata per selezionare solo i dati richiesti poiché ogni predicato restituisce True o False.

Se non c’è PushedFilter trovato nel piano di query, è meglio lanciare la condizione where. Predicato Pushdowns limita il numero di file e partizioni che SparkSQL legge durante l’interrogazione, riducendo così disco I/O avvia Analisi in memoria. L’interrogazione sui dati in bucket con pushdown dei predicati produce risultati più veloci con meno shuffle.

Serializzazione/deserializzazione dei dati zero utilizzando Apache Arrow

Apache Arrow viene utilizzato come formato di runtime in memoria per i motori di query analitiche. Arrow fornisce la serializzazione / deserializzazione dei dati zero shuffles attraverso la memoria condivisa. Arrow flight invia i grandi set di dati sulla rete. Arrow ha il suo formato di file arrow che consente l’accesso casuale a zero copie ai dati su dischi. Arrow ha un livello di accesso ai dati standard per tutte le applicazioni spark.

Riduce il sovraccarico per le operazioni SerDe per lo shuffling dei dati in quanto ha un luogo comune in cui tutti i dati risiedono e nel formato specifico della freccia.

Garbage Collection Tuning utilizzando G1GC Collection

Quando si sintonizzano i garbage collector, si consiglia innanzitutto di utilizzare G1 GC per eseguire le applicazioni Spark. Il garbage collector G1 gestisce interamente i cumuli in crescita che si vedono comunemente con Spark. Con G1, saranno necessarie meno opzioni per fornire un throughput più elevato e una latenza inferiore. Per controllare le caratteristiche imprevedibili e comportamenti di varie applicazioni GC tuning deve essere masterizzato in base ai registri generati.

Prima di questo, devono essere applicate altre tecniche di ottimizzazione come lo streaming e le soluzioni di analisi in tempo reale, nella logica e nel codice del programma. Il più delle volte, G1GC aiuta a ottimizzare il tempo di pausa tra i processi che sono abbastanza spesso nelle applicazioni Spark, quindi diminuisce il tempo di esecuzione del lavoro con un sistema più affidabile.

Gestione e ottimizzazione della memoria

Come sappiamo, per calcoli come lo shuffling, l’ordinamento e così via, viene utilizzata la memoria di esecuzione mentre per scopi di memorizzazione nella cache viene utilizzata la memoria di archiviazione che propaga anche i dati interni. Potrebbero esserci alcuni casi in cui i lavori non utilizzano alcuna cache; pertanto, casi di errore di spazio durante l’esecuzione. I lavori memorizzati nella cache applicano sempre meno spazio di archiviazione in cui i dati non possono essere sfrattati da alcun requisito di esecuzione. Inoltre, è possibile eseguire applicazioni di streaming in tempo reale con Apache Spark.

Possiamo impostare spark.memoria.frazione per determinare quanto spazio heap JVM viene utilizzato per la memoria di esecuzione Spark. Comunemente, il 60% è il valore predefinito. La memoria Executor deve essere mantenuta il meno possibile perché può portare al ritardo della Garbage collection JVM. Questo fatto è applicabile anche per i piccoli esecutori in quanto più attività possono essere eseguite su una singola istanza JVM.

Località dei dati

In Apache Spark, le attività di elaborazione vengono ottimizzate posizionando il codice di esecuzione vicino ai dati elaborati, chiamati località dei dati. A volte l’attività di elaborazione deve attendere prima di ottenere i dati perché i dati non sono disponibili. Tuttavia, quando il tempo di scintilla.localita.attendere scade, Spark tenta meno livello locale, cioè, locale al nodo per rack a qualsiasi.

Il trasferimento dei dati tra dischi è molto costoso, quindi la maggior parte delle operazioni deve essere eseguita nel luogo in cui risiedono i dati. Aiuta a caricare solo piccoli ma necessari la quantità di dati insieme allo sviluppo guidato dai test per Apache Spark.

Utilizzando i join collocati

I join collocati prendono decisioni di ridistribuzione e trasmissione. Possiamo definire piccoli set di dati da posizionare in più blocchi di memoria per ottenere un migliore utilizzo della trasmissione. Durante l’applicazione di join su due set di dati, spark ordina prima i dati di entrambi i set di dati per chiave e li unisce.

Ma, possiamo anche applicare sort partition key prima di unirsi a loro o durante la creazione di quei frame di dati INApache Arrow Architecture. Ciò ottimizzerà il tempo di esecuzione della query in quanto non ci sarebbero chiamate di funzione non necessarie da ordinare.

Caching in Spark

Il caching in Apache Spark con GPU è la tecnica migliore per l’ottimizzazione di Apache Spark quando abbiamo bisogno di alcuni dati ancora e ancora. Ma non è sempre accettabile memorizzare i dati nella cache.

Dobbiamo usare cache () RDD e DataFrames in uno dei seguenti casi–

  • Quando c’è un ciclo iterativo come negli algoritmi di apprendimento automatico.
  • Quando si accede a RDD più volte in un singolo lavoro o attività.
  • Quando il costo per generare nuovamente le partizioni RDD è più alto.

Cache () e persist (StorageLevel.MEMORY_ONLY) possono essere usati l’uno al posto dell’altro. Ogni partizione RDD che viene sfrattata dalla memoria deve essere nuovamente compilata dalla sorgente che è ancora molto costosa. Una delle migliori soluzioni è utilizzare persist (livello di archiviazione.MEMORY_AND_DISK_ONLY) che verserebbe le partizioni di RDD sul disco locale del Lavoratore. Questo caso richiede solo l’acquisizione di dati dall’unità locale del lavoratore che è relativamente veloce.

Executor Size

Quando eseguiamo esecutori con memoria elevata, spesso si verificano ritardi eccessivi nella garbage collection. Dobbiamo mantenere il conteggio dei core per esecutore al di sotto di cinque attività per esecutore. Gli esecutori troppo piccoli non sono risultati utili in termini di esecuzione di più lavori su una singola JVM.

Ad esempio, le variabili broadcast devono essere replicate per ogni esecutore esattamente una volta, il che comporterà più copie dei dati.

Funzione Spark Windowing

Una funzione window definisce un frame attraverso il quale possiamo calcolare le righe di input di una tabella. A livello di riga individuale. Ogni riga può avere un quadro chiaro. Windowing ci permette di definire una finestra per i dati nel frame di dati. Possiamo confrontare più righe nello stesso frame di dati.

Possiamo impostare l’ora della finestra su un particolare intervallo che risolverà il problema della dipendenza dai dati con i dati precedenti. Lo shuffling in Apache Beam è inferiore ai dati elaborati in precedenza poiché conserviamo tali dati per l’intervallo di finestra.

Tecnica delle filigrane

La filigrana è una tecnica utile nell’ottimizzazione di Apache Spark che vincola il sistema in base alla progettazione e aiuta a impedirne l’esplosione durante la corsa. Filigrana prende due argomenti–

  • Colonna per il tempo dell’evento e
  • Un tempo di soglia che specifica per quanto tempo ci viene richiesto di elaborare dati tardivi

La query nell’architettura Apache Arrow verrà automaticamente aggiornata se i dati rientrano nella soglia stabilita; in caso contrario, non viene attivata alcuna elaborazione per tali dati ritardati. Bisogna ricordare che possiamo usare la modalità completa fianco a fianco con la filigrana perché la modalità completa prima persiste tutti i dati nella tabella risultante.

Serializzazione dei dati

Apache Spark optimization lavora sui dati che dobbiamo elaborare per alcuni casi d’uso come l’Analisi o solo per lo spostamento dei dati. Questo movimento di dati o Analisi può essere eseguito bene se i dati sono in un formato meglio serializzato. Apache Spark supporta la serializzazione dei dati per gestire in modo efficace i formati di dati necessari all’origine o alla destinazione. Per impostazione predefinita, Apache Spark utilizza la serializzazione Java ma supporta anche la serializzazione Kryo.

Per impostazione predefinita, Spark utilizza ObjectOutputStream di Java per serializzare i dati. L’implementazione può avvenire tramite java.io.Classe serializzabile. Codifica gli oggetti in un flusso di byte. Fornisce persistenza leggera e flessibile. Ma diventa lento in quanto porta a enormi formati serializzati per ogni classe in cui viene utilizzato. Spark supporta Kryo Serializzazione library (v4) per la serializzazione di oggetti quasi 10 volte più veloce di Java Serializzazione in quanto è più compatto di Java.

Ottimizzazione di Apache Spark: Un approccio completo

Apache Spark, un motore di calcolo distribuito open-source, è attualmente il framework più popolare per l’elaborazione batch in memoria, che supporta anche lo streaming in tempo reale. Con il suo motore avanzato di ottimizzazione delle query e di esecuzione, le tecniche di ottimizzazione di Apache Spark possono elaborare e analizzare grandi set di dati in modo molto efficiente. Tuttavia, l’esecuzione di tecniche di ottimizzazione Apache Spark Join senza un’attenta messa a punto può degradare le prestazioni. Se vuoi sfruttare la potenza dell’applicazione Apache Spark, consulta i nostri servizi Apache Spark gestiti.

Categorie :

Sviluppo di Big Data, soluzioni di Big Data, analisi dei dati in streaming,

Condividi:

You might also like

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.