La scalabilità automatica di Managed Service for Apache Spark consente di scalare dinamicamente le risorse del workload, ad esempio il numero di esecutori, per eseguire i job Spark in modo efficiente. Attivata per impostazione predefinita, la scalabilità automatica 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 risparmiare sui costi:
- Downscaling asincrono dei nodi: la scalabilità automatica V2 sostituisce il downscaling sincrono della V1 con il downscaling asincrono. Utilizzando lo scale down asincrono, Managed Service for Apache Spark esegue lo scale down delle risorse del workload senza attendere che tutti i nodi completino la migrazione dello shuffle. Ciò significa che i nodi con coda lunga che fanno fare lo scale down lentamente non bloccheranno lo scale up.
- Selezione intelligente dei nodi per 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 shuffle e il tempo di inattività del nodo.
- Comportamento configurabile di dismissione controllata e migrazione dello shuffle di Spark: la scalabilità automatica V2 ti consente di utilizzare le proprietà Spark standard per configurare la dismissione controllata e la migrazione dello 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 |
| Downscaling dei nodi | Sincrona | Asincrona |
| Selezione dei nodi per lo scale down | Casuale | Soluzione intelligente |
| Rimozione controllata di Spark e migrazione dello 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 workload batch per controllare la scalabilità automatica (consulta 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 riduce 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 workload, 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 per lo scale down del workload.
Il valore minimo è 2. |
2 |
spark.dynamicAllocation.maxExecutors |
Il numero massimo di esecutori per lo scale up del workload.
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 pari a 1.0
offre la massima capacità di scale up e aiuta a ottenere il massimo
parallelismo. Un valore pari a 0.5 imposta la funzionalità di scale up e il parallelismo su metà del valore massimo. |
0.3 |
spark.dynamicAllocation.diagnosis.enabled |
Quando true, le informazioni diagnostiche vengono registrate se gli esecutori in esecuzione superano il numero massimo di esecutori necessari per il periodo specificato da spark.dynamicAllocation.diagnosis.interval.
La diagnosi include un riepilogo degli esecutori con il numero di esecutori inattivi e i percentili del tempo di inattività, la distribuzione delle attività attive, le dimensioni dei dati di shuffle 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'efficienza in termini di costi.
Le proprietà definite dall'utente sostituiscono i valori predefiniti del profilo. Per maggiori dettagli, consulta Profili di allocazione dinamica di Spark. |
none |
spark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled |
Se impostato su true, attiva il calcolo del timeout dinamico per gli esecutori che contengono dati di shuffling.
Anziché utilizzare il valore statico spark.dynamicAllocation.shuffleTracking.timeout,
il timeout viene calcolato in base alla quantità di dati di shuffle archiviati nell'esecutore.
In questo modo, gli esecutori con shuffle di piccole dimensioni possono essere rilasciati più velocemente, mentre quelli con shuffle di grandi dimensioni rimangono attivi più a lungo. |
false |
spark.reducer.fetchMigratedShuffle.enabled |
Se impostato su true, attiva il recupero della posizione di output dello shuffle dal driver Spark dopo che un recupero non è riuscito da un esecutore che è stato ritirato a causa dell'allocazione dinamica di Spark. In questo modo si riducono gli errori ExecutorDeadException causati dalla migrazione dei blocchi di shuffle dagli esecutori ritirati a quelli attivi e si riducono i nuovi tentativi di fase causati dagli errori FetchFailedException (vedi FetchFailedException causata da ExecutorDeadException).
Questa proprietà è disponibile nelle versioni del runtime Spark di Managed Service for Apache Spark 1.1.12 e versioni successive e 2.0.20 e versioni successive. |
false |
spark.scheduler.excludeShuffleSkewExecutors |
Se impostato su true, evita di pianificare le attività su esecutori con asimmetria di shuffling, ovvero esecutori con una grande quantità di dati di shuffling o un numero elevato di attività di mappatura completate. In questo modo, puoi migliorare le prestazioni mitigando 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 alla proprietà spark.dynamicAllocation.profile,
le tue impostazioni sostituiranno i valori predefiniti del profilo per queste proprietà.
performance: questo profilo ottimizza il tempo di esecuzione minimo applicando le seguenti impostazioni predefinite:
spark.scheduler.excludeShuffleSkewExecutors:truespark.dynamicAllocation.executorIdleTimeout:300sspark.dynamicAllocation.initialExecutors:10
cost: questo profilo ottimizza il consumo di risorse applicando le seguenti impostazioni predefinite:
spark.dynamicAllocation.executorIdleTimeout:120sspark.dynamicAllocation.cachedExecutorIdleTimeout:120sspark.dynamicAllocation.shuffleTracking.dynamicTimeout.enabled:truespark.dynamicAllocation.diagnosis.enabled:true
Metriche di allocazione dinamica di Spark
I workload 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 fa lo scale down di un esecutore, viene eseguita la migrazione del file di shuffle agli esecutori attivi. Tuttavia, poiché l'attività del riduttore Spark su un esecutore recupera l'output di shuffle dalla posizione impostata dal driver Spark all'avvio dell'attività del riduttore, se viene eseguita la migrazione di un file di shuffle, il riduttore può continuare a tentare di recuperare l'output di shuffle da un esecutore ritirato, causando errori
ExecutorDeadExceptioneFetchFailedException.Soluzione: attiva il recupero della posizione di shuffle impostando
spark.reducer.fetchMigratedShuffle.enabledsutruequando esegui il workload batch Managed Service for Apache Spark (consulta Imposta le proprietà del workload batch Spark). Quando questa proprietà è abilitata, l'attività del reducer recupera nuovamente la posizione dell'output di shuffle dal driver dopo che un recupero da un esecutore dismesso non è andato a buon fine.