Configurare le prestazioni di calcolo
La configurazione delle risorse di calcolo comporta il bilanciamento dei requisiti di prestazioni con considerazioni relative ai costi. Il provisioning eccessivo comporta spese non necessarie, mentre il sottoprovisioning può causare problemi di stabilità e rallentamento dell'esecuzione delle query. Informazioni su come configurare le impostazioni di calcolo consente di ottimizzare le risorse per il carico di lavoro.
Informazioni sui componenti delle risorse di calcolo
Le prestazioni di calcolo dipendono da tre fattori chiave che interagiscono. Ogni fattore influenza l'efficienza dell'esecuzione del carico di lavoro e la quantità di costi.
Core totali dell'executor determinano il parallelismo massimo disponibile per l'elaborazione dei dati. Più core consentono a Spark di elaborare più attività contemporaneamente. Un cluster con 8 ruoli di lavoro, ognuno con 4 core, fornisce 32 core totali per l'elaborazione parallela.
La memoria totale dell'executor influisce sulla quantità di dati che possono essere elaborati in memoria prima della distribuzione su disco. Le operazioni a elevato utilizzo di memoria, ad esempio join e aggregazioni, traggono vantaggio da configurazioni di memoria più grandi. Quando si esaurisce la memoria, Spark scrive i dati su disco, rallentando significativamente le prestazioni.
L'archiviazione locale fornisce spazio temporaneo per le operazioni di shuffle e la memorizzazione nella cache. Durante le operazioni di shuffle, Spark scrive i dati intermedi nei dischi locali sui nodi di lavoro. L'archiviazione locale veloce riduce il tempo impiegato per queste operazioni.
Con questa conoscenza dei componenti di calcolo, è possibile prendere decisioni informate sui tipi di nodo e sulle dimensioni del cluster.
Configurare i tipi di nodo e le dimensioni del cluster
La selezione dei tipi di nodo influisce direttamente sulle prestazioni e sui costi. Famiglie di istanze diverse sono destinate a diverse caratteristiche di carico di lavoro.
Le istanze ottimizzate per la memoria funzionano bene per i carichi di lavoro con join, aggregazioni o dati di grandi dimensioni che devono rimanere in memoria. Queste istanze forniscono più RAM per core, riducendo la probabilità di trasferire dati su disco. Tra gli esempi sono incluse le macchine virtuali serie E , che offrono rapporti di memoria-core elevati ideali per l'analisi in memoria.
Le istanze ottimizzate per il calcolo soddisfano i carichi di lavoro che eseguono calcoli complessi, ma non richiedono grandi quantità di memoria. I processi ETL con trasformazioni semplici vengono spesso eseguiti in modo efficiente in queste istanze. Gli esempi includono macchine virtuali serie F , che offrono prestazioni cpu elevate con rapporti di memoria inferiori.
Le istanze ottimizzate per l'archiviazione traggono vantaggio dai carichi di lavoro che leggono ripetutamente gli stessi dati o richiedono un accesso rapido al disco locale. I carichi di lavoro di analisi dei dati con memorizzazione nella cache abilitata offrono prestazioni migliori con queste istanze. Gli esempi includono macchine virtuali serie L , che offrono un'archiviazione NVMe locale veloce per carichi di lavoro di I/O elevati.
Le istanze con accelerazione GPU offrono unità di elaborazione grafica progettate per carichi di lavoro a elevato utilizzo di calcolo, ad esempio Machine Learning, Deep Learning ed elaborazione delle immagini. Queste istanze possono accelerare il training del modello di 10-100 volte rispetto ai cluster solo CPU. Gli esempi includono macchine virtuali serie NC e serie ND con GPU NVIDIA. Le istanze GPU richiedono Machine Learning di Databricks Runtime e funzionano meglio per attività come il training di reti neurali, l'ottimizzazione di modelli linguistici di grandi dimensioni o l'esecuzione dell'inferenza su modelli complessi.
Il bilanciamento tra il numero di lavoratori e le dimensioni dell'istanza influisce sulle prestazioni in maniera diversa a seconda del tipo di carico di lavoro. Due ruoli di lavoro con 16 core e 128 GB di RAM forniscono ciascuno lo stesso calcolo e memoria totale di otto ruoli di lavoro con 4 core e 32 GB di RAM ciascuno. Tuttavia, la configurazione con meno worker di dimensioni maggiori riduce il traffico di rete durante le operazioni di rimescolamento, mentre più worker più piccoli possono offrire un parallelismo migliore per carichi di lavoro altamente distribuiti.
Per i carichi di lavoro analitici con molte operazioni di rimescolamento, meno lavoratori più grandi in genere offrono prestazioni migliori. Per un'elaborazione batch semplice che trae vantaggio dall'elevato parallelismo, i ruoli di lavoro più piccoli potrebbero risultare più convenienti.
Usare tipi di nodo flessibili
Quando Azure Databricks avvia una risorsa di calcolo, il provider di servizi cloud può occasionalmente esaurire la capacità per il tipo di istanza specificato. In questo modo si verifica un CLOUD_PROVIDER_RESOURCE_STOCKOUT errore, che può ritardare o non riuscire l'esecuzione del processo senza avviso.
I tipi di nodo flessibili rispondono a questo problema eseguendo automaticamente il fallback ai tipi di istanza alternativi compatibili quando il tipo preferito non è disponibile. Le alternative compatibili condividono lo stesso numero di vCPU, la memoria (entro 100-110%), la configurazione del disco locale, l'architettura della CPU e il supporto delle immagini del sistema operativo come tipo di istanza primaria, assicurando che il carico di lavoro venga eseguito correttamente indipendentemente dal tipo acquisito.
Gli amministratori dell'area di lavoro abilitano questa funzionalità attivando Abilita i tipi di nodo flessibili automatici nelle impostazioni di amministrazione dell'area di lavoro Calcolo. Dopo l'abilitazione, tutte le nuove risorse di calcolo classiche usano automaticamente i tipi di istanza di fallback. Questo è particolarmente utile per le istanze spot: i tipi di nodo flessibili possono tentare l'acquisizione attraverso più tipi compatibili prima di eseguire il fallback su richiesta, aumentando la percentuale di istanze spot usate e riducendo i costi di elaborazione totali.
Per i carichi di lavoro con requisiti di tipo di istanza rigorosi, è possibile disabilitare i tipi di nodo flessibili per una singola risorsa di calcolo impostando alternate_node_type_ids un elenco vuoto tramite l'API Clusters. È anche possibile specificare un elenco di fallback personalizzato tramite l'API se si preferisce controllare quali tipi alternativi vengono usati anziché basarsi sulla selezione automatica.
Configurare la scalabilità automatica
La scalabilità automatica regola il numero di ruoli di lavoro in base alle esigenze del carico di lavoro, consentendo di mantenere le prestazioni controllando i costi.
Quando si abilita la scalabilità automatica, si impostano il numero minimo e massimo di ruoli di lavoro. Azure Databricks monitora i requisiti del carico di lavoro e aggiunge lavoratori quando necessario, fino al massimo specificato. Quando la domanda diminuisce, i lavoratori vengono rimossi al minimo.
Azure Databricks usa la scalabilità automatica ottimizzata per impostazione predefinita quando si abilita la scalabilità automatica. La scalabilità automatica ottimizzata aumenta rapidamente in due passaggi, dal minimo al massimo. Può ridurre la scala anche quando il cluster non è inattivo monitorando lo stato del file di shuffle. Per job compute, valuta l'utilizzo ogni 40 secondi. Per l'elaborazione generica, controlla ogni 150 secondi.
Prendere in considerazione la scalabilità automatica per i carichi di lavoro con esigenze di risorse variabili durante l'esecuzione. Le sessioni di esplorazione dei dati spesso iniziano con piccoli esempi di dati e successivamente elaborano set di dati di dimensioni maggiori. La scalabilità automatica aggiunge ruoli di lavoro quando si elaborano i set di dati più grandi e li rimuove quando si torna a campioni più piccoli.
Per i carichi di lavoro prevedibili che mantengono un utilizzo coerente delle risorse, un numero fisso di ruoli di lavoro offre spesso prestazioni più stabili e una pianificazione della capacità più semplice. Il sovraccarico delle decisioni di ridimensionamento può influire leggermente sulle prestazioni per i carichi di lavoro con stato stabile.
La scalabilità automatica funziona particolarmente bene con i pool di istanze. Imposta le unità di lavoro minime uguali o inferiori alle istanze inattive minime nel pool. In questo modo si garantisce un ridimensionamento rapido perché le istanze sono già state provisionate e sono pronte.
Configurare le impostazioni di terminazione
La terminazione automatica impedisce alle risorse di calcolo inattive di accumulare costi non necessari mantenendo la disponibilità per i carichi di lavoro pianificati.
Quando si configura la terminazione automatica, si specifica un periodo di inattività in minuti. Se non vengono eseguiti comandi nel cluster per più di questo periodo, Azure Databricks termina il cluster. La configurazione del cluster rimane disponibile per il riavvio quando necessario.
Per carichi di lavoro interattivi come l'analisi dei dati, impostare il periodo di terminazione in base ai modelli di sessione tipici. Un timeout di 45 minuti funziona bene per la maggior parte dei casi d'uso, offrendo ai data engineer il tempo necessario per esaminare i risultati tra le query senza lasciare inattive i cluster per ore.
Per l'elaborazione dei compiti, la terminazione automatica avviene al termine del compito. Il cluster viene avviato automaticamente all'avvio della successiva esecuzione pianificata, quindi non è necessario gestire manualmente l'avvio.
Le istanze spot riducono i costi, ma presentano compromessi di disponibilità. Azure può recuperare istanze spot quando la capacità è necessaria altrove. Per i nodi di lavoro, le istanze spot funzionano bene perché Azure Databricks/Spark può gestire i guasti dei nodi di lavoro. Tuttavia, usare sempre istanze su richiesta per i nodi driver. Se il driver viene riassegnato, l'intero cluster fallisce.
Abilitare la disattivazione quando si usano istanze spot per ridurre gli errori delle attività. Quando un'istanza spot riceve un avviso di interruzione, la decommissione migra i dati di shuffle e memorizzati nella cache a nodi di lavoro integri prima che l'istanza termini. In questo modo si riduce la necessità di ricompilare i dati persi.
Usare i pool di istanze
I pool di istanze mantengono un set di istanze inattive pronte per l'uso immediato, riducendo il tempo di avvio del cluster da minuti a secondi.
Configurare le istanze minime inattive in modo che corrispondano alle esigenze tipiche del cluster simultaneo. Se si eseguono regolarmente tre notebook contemporaneamente, mantenere almeno tre istanze inattive. Queste istanze rimangono disponibili anche quando non sono in uso, fornendo l'avvio immediato del cluster.
Impostare la capacità massima per controllare i costi e impedire a un carico di lavoro di usare tutte le risorse disponibili. Quando più team condividono un'area di lavoro, i pool con le impostazioni di capacità massima garantiscono una distribuzione equa delle risorse. Ad esempio, con una quota di 100 istanze, è possibile creare due pool ognuno con un massimo di 50 istanze per due team.
L'impostazione di terminazione automatica dell'istanza inattiva rimuove le istanze che superano il numero minimo di inattività dopo il periodo specificato. Se si imposta il periodo minimo di inattività su 3 e la terminazione automatica su 30 minuti, un pool che aumenta fino a 8 istanze tornerà a 3 istanze dopo 30 minuti di inattività.
Il precaricamento di una versione di Databricks Runtime nelle istanze del pool accelera ulteriormente l'avvio del cluster. Quando si crea un cluster, se si seleziona il runtime precaricato, il cluster si avvia quasi immediatamente perché il runtime è già installato sulle istanze inattive.
I pool funzionano meglio per i carichi di lavoro con cicli frequenti di creazione e terminazione del cluster. I team di sviluppo che creano ed eliminano i cluster durante tutto il giorno vedono risparmi significativi in termini di tempo. I processi di produzione eseguiti in cluster dedicati a esecuzione prolungata non traggono vantaggio tanto dai pool.
Bilanciare i costi e le prestazioni
Per ottenere il giusto equilibrio tra costi e prestazioni, è necessario comprendere le caratteristiche del carico di lavoro e regolare le configurazioni di conseguenza.
Iniziare con le impostazioni conservatrici e monitorare le prestazioni. Se noti uno scenario frequente di scrittura su disco o un'esecuzione lenta delle query, aumenta la quantità di memoria o il numero di core. Se l'utilizzo rimane basso, ridurre le dimensioni del cluster o abilitare la scalabilità automatica.
Annotazioni
Usare l'interfaccia utente di Spark per identificare i problemi di prestazioni. Controllare il Timeline dei lavori per trovare le fasi a esecuzione prolungata e visualizzare la pagina dei dettagli della fase per visualizzare le statistiche su Shuffle Spill (Memoria) e Shuffle Spill (Disco). Confrontare le durate delle fasi per identificare i colli di bottiglia e le query lente.
Usare il calcolo serverless quando il carico di lavoro lo supporta. Serverless elimina le decisioni di configurazione e ridimensiona automaticamente in base alla domanda, offrendo spesso il miglior bilanciamento delle prestazioni senza ottimizzazione manuale.
Il monitoraggio regolare consente di identificare le opportunità di ottimizzazione. Esaminare le metriche del cluster per visualizzare l'utilizzo effettivo rispetto alla capacità prevista. Modificare i tipi di nodo, i conteggi dei ruoli di lavoro o le impostazioni di ridimensionamento in base ai modelli osservati anziché ai presupposti.
Annotazioni
Il monitoraggio e l'osservabilità sono descritti in dettaglio in un modulo successivo.