Scalare automaticamente le risorse del workload

Questo documento fornisce informazioni sullo scalabilità automatica di Managed Service for Apache Spark. Quando invii il workload Spark, Managed Service for Apache Spark può scalare dinamicamente le risorse del workload, ad esempio il numero di esecutori, per eseguire il workload in modo efficiente. La scalabilità automatica di Managed Service for Apache Spark è il comportamento predefinito e utilizza l'allocazione dinamica delle risorse di Spark per determinare se, come e quando scalare il workload.

Scalabilità automatica V2 di Managed Service for Apache Spark

La versione 2 (V2) della scalabilità automatica di Managed Service for Apache Spark aggiunge funzionalità e miglioramenti alla versione 1 (V1) predefinita per aiutarti a gestire i workload di Managed Service for Apache Spark, migliorare le prestazioni dei workload e ridurre i costi:

  • Ridimensionamento asincrono dei nodi: la scalabilità automatica V2 sostituisce il ridimensionamento sincrono di V1 con il ridimensionamento asincrono. Utilizzando la riduzione delle risorse asincrona, Managed Service for Apache Spark riduce le risorse del workload senza attendere che tutti i nodi terminino la migrazione shuffle. Ciò significa che i nodi long-tail che vengono fare lo scale down lentamente non bloccheranno l'upscaling.
  • Selezione intelligente dei nodi per fare lo scale down: la scalabilità automatica V2 sostituisce la selezione casuale dei nodi della V1 con un algoritmo intelligente che identifica i nodi migliori per fare lo scale down per primi. Questo algoritmo prende in considerazione fattori come le dimensioni dei dati di rimescolamento e il tempo di inattività del nodo.
  • Comportamento configurabile di ritiro controllato e migrazione shuffle di Spark: Autoscaling V2 ti consente di utilizzare le proprietà Spark standard per configurare il ritiro controllato e la migrazione shuffle di Spark. Questa funzionalità può aiutarti a mantenere la compatibilità della migrazione con le proprietà Spark personalizzate.

Funzionalità di scalabilità automatica di Managed Service for Apache Spark

Funzionalità Scalabilità automatica di Managed Service for Apache Spark V1 Scalabilità automatica V2 di Managed Service for Apache Spark
Riduzione delle dimensioni dei nodi Sincrona Asincrona
Selezione dei nodi per la riduzione delle risorse Casuale Soluzione intelligente
Rimozione controllata di Spark e migrazione shuffle Non configurabile Configurabile

Proprietà di allocazione dinamica di Spark

La tabella seguente elenca le proprietà di allocazione dinamica di Spark che puoi impostare quando invii un carico di lavoro batch per controllare la scalabilità automatica (vedi come impostare le proprietà di Spark).

Proprietà Descrizione Predefinito
spark.dataproc.scaling.version La versione di scalabilità automatica di Managed Service for Apache Spark. Specifica la versione 1 o 2. 1
spark.dynamicAllocation.enabled Se utilizzare l'allocazione dinamica delle risorse, che aumenta e diminuisce il numero di esecutori in base al workload. Se imposti il valore su false, la scalabilità automatica viene disattivata per il workload. Valore predefinito: true. true
spark.dynamicAllocation.initialExecutors Il numero iniziale di esecutori allocati al workload. Dopo l'avvio del carico di lavoro, la scalabilità automatica potrebbe modificare il numero di esecutori attivi. Il valore minimo è 2, il valore massimo è 2000. 2
spark.dynamicAllocation.minExecutors Il numero minimo di esecutori a cui ridurre il workload. Il valore minimo è 2. 2
spark.dynamicAllocation.maxExecutors Il numero massimo di esecutori a cui scalare il carico di lavoro. Il valore massimo è 2000. 1000
spark.dynamicAllocation.executorAllocationRatio Personalizza lo scale up del workload Spark. Accetta un valore compreso tra 0 e 1. Un valore di 1.0 offre la massima capacità di scalabilità e contribuisce a ottenere il massimo parallelismo. Un valore di 0.5 imposta la capacità di scalabilità verticale e il parallelismo a metà del valore massimo. 0.3
spark.dynamicAllocation.diagnosis.enabled Quando true, le informazioni diagnostiche vengono registrate se gli executor in esecuzione superano il numero massimo di executor necessari per il periodo specificato da spark.dynamicAllocation.diagnosis.interval. La diagnostica include un riepilogo dell'esecutore con il conteggio degli esecutori inattivi e i percentili di tempo di inattività, la distribuzione delle attività attive, le dimensioni dei dati di shuffling e le dimensioni degli RDD memorizzati nella cache. Utilizza spark.dynamicAllocation.diagnosis.logLevel per controllare il livello di log di output. false
spark.dynamicAllocation.profile Imposta su performance o cost per applicare un insieme predefinito di configurazioni ottimizzate per le prestazioni o l'efficacia in termini di costi. Le proprietà definite dall'utente sostituiscono i valori predefiniti del profilo. Per i dettagli, vedi Profili di allocazione dinamica Spark. none
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled Quando true, attiva il calcolo dinamico del timeout per gli executor che contengono dati di rimescolamento. Anziché utilizzare il valore statico spark.dynamicAllocation.shuffleTracking.timeout, il timeout viene calcolato in base alla quantità di dati di shuffling archiviati sull'executor. In questo modo, gli esecutori con shuffle di piccole dimensioni vengono rilasciati più rapidamente, mentre quelli con shuffle di grandi dimensioni rimangono attivi più a lungo. false
spark.reducer.fetchMigratedShuffle.enabled Se impostato su true, consente di recuperare la posizione dell'output di rimescolamento dal driver Spark dopo che il recupero non è riuscito da un executor ritirato a causa dell'allocazione dinamica di Spark. In questo modo si riducono gli errori ExecutorDeadException causati dalla migrazione dei blocchi di rimescolamento dagli executor ritirati a quelli attivi e si riducono i nuovi tentativi di esecuzione dello stage causati da errori FetchFailedException (vedi FetchFailedException causata da ExecutorDeadException). Questa proprietà è disponibile in Managed Service for Apache Spark versioni del runtime di Spark 1.1.12 e successive e 2.0.20 e successive. false
spark.scheduler.excludeShuffleSkewExecutors Quando true, evita di pianificare le attività su esecutori con distorsione dello shuffling, ovvero esecutori con una grande quantità di dati di shuffling o un numero elevato di attività di mapping completate. Ciò può migliorare il rendimento riducendo l'asimmetria dello shuffle. false

Profili di allocazione dinamica di Spark

Puoi impostare la proprietà spark.dynamicAllocation.profile su performance o cost per applicare un insieme predefinito di configurazioni Spark ottimizzate per le prestazioni o l'efficacia in termini di costi. Se imposti le proprietà Spark oltre a impostare la proprietà spark.dynamicAllocation.profile, le tue impostazioni sostituiranno i valori predefiniti del profilo per queste proprietà.

rendimento: questo profilo esegue l'ottimizzazione per il tempo di esecuzione minimo applicando le seguenti impostazioni predefinite:

  • spark.scheduler.excludeShuffleSkewExecutors: true
  • spark.dynamicAllocation.executorIdleTimeout: 300s
  • spark.dynamicAllocation.initialExecutors: 10

cost: questo profilo è ottimizzato per ridurre il consumo di risorse applicando le seguenti impostazioni predefinite:

  • spark.dynamicAllocation.executorIdleTimeout: 120s
  • spark.dynamicAllocation.cachedExecutorIdleTimeout: 120s
  • spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled: true
  • spark.dynamicAllocation.diagnosis.enabled: true

Metriche di allocazione dinamica di Spark

I carichi di lavoro batch Spark generano le seguenti metriche relative all'allocazione dinamica delle risorse Spark (per ulteriori informazioni sulle metriche Spark, consulta Monitoraggio e strumentazione).

Metrica Descrizione
maximum-needed Il numero massimo di esecutori necessari con il carico attuale per soddisfare tutte le attività in esecuzione e in attesa.
running Il numero di esecutori in esecuzione che eseguono attività.

Problemi e soluzioni relativi all'allocazione dinamica di Spark

  • FetchFailedException causata da ExecutorDeadException

    Causa: quando l'allocazione dinamica di Spark riduce le dimensioni di un executor, viene eseguita la migrazione del file di rimescolamento agli executor attivi. Tuttavia, poiché l'attività di riduzione Spark su un executor recupera l'output di shuffle dalla posizione impostata dal driver Spark all'avvio dell'attività di riduzione, se un file di shuffle viene migrato, il reducer può continuare a tentare di recuperare l'output di shuffle da un executor ritirato, causando errori ExecutorDeadException e FetchFailedException.

    Soluzione: attiva il recupero della posizione di shuffling impostando spark.reducer.fetchMigratedShuffle.enabled su true quando esegui il workload batch Managed Service for Apache Spark (vedi Impostare le proprietà del workload batch Spark). Quando questa proprietà è abilitata, l'attività di riduzione recupera nuovamente la posizione dell'output di shuffle dal driver dopo che un recupero da un esecutore ritirato non riesce.