Questo documento fornisce informazioni sulla 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 eseguirlo 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 di Managed Service for Apache Spark V2
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 il rendimento dei workload e ridurre i costi:
- Riduzione asincrona dei nodi: la scalabilità automatica V2 sostituisce la riduzione sincrona della V1 con la riduzione asincrona. Utilizzando la riduzione asincrona, Managed Service for Apache Spark riduce le risorse del workload senza attendere che tutti i nodi completino la migrazione dello shuffle. Ciò significa che i nodi long-tail che fanno fare lo scale down lentamente non bloccheranno lo scale up.
- Selezione intelligente dei nodi per la riduzione: la scalabilità automatica V2 sostituisce la selezione casuale dei nodi della V1 con un algoritmo intelligente che identifica i nodi migliori da fare lo scale down per primi. Questo algoritmo considera fattori come le dimensioni dei dati di shuffle del nodo e il tempo di inattività.
- Comportamento configurabile di ritiro gestito automaticamente di Spark e migrazione dello shuffle: la scalabilità automatica V2 consente di utilizzare le proprietà Spark standard per configurare il ritiro gestito automaticamente di Spark e la migrazione dello shuffle. 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 di Managed Service for Apache Spark V2 |
| Riduzione dei nodi | Sincrona | Asincrona |
| Selezione dei nodi per la riduzione | Casuale | Intelligente |
| Rimozione controllata di Spark e migrazione dello shuffling | Non configurabile | Configurabile |
Proprietà di allocazione dinamica di Spark
La seguente tabella elenca le proprietà di allocazione dinamica di Spark che puoi impostare quando invii un workload batch per controllare la scalabilità automatica (vedi come impostare le proprietà Spark).
| Proprietà | Descrizione | Predefinito |
|---|---|---|
spark.dataproc.scaling.version |
La versione della scalabilità automatica di Spark di Managed Service for Apache Spark. Specifica
la versione 1 o 2 (vedi
Scalabilità automatica di Managed Service for Apache Spark V2). |
1 |
spark.dynamicAllocation.enabled |
Indica 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
per il workload viene disattivata. 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 a cui ridurre il workload.
Il valore minimo è 2. |
2 |
spark.dynamicAllocation.maxExecutors |
Il numero massimo di esecutori a cui aumentare il 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 di 1.0 fornisce la massima capacità di scale up e aiuta a ottenere il massimo parallelismo. Un valore di 0.5 imposta la capacità di scale up e il parallelismo a metà del valore massimo. |
0.3 |
spark.dynamicAllocation.diagnosis.enabled |
Se true, le informazioni di diagnostica vengono registrate se gli esecutori in esecuzione superano gli esecutori massimi necessari
per il periodo specificato da spark.dynamicAllocation.diagnosis.interval.
La diagnostica include un riepilogo degli esecutori con il conteggio degli esecutori inattivi e i percentili del tempo di inattività
la distribuzione delle attività attive, le dimensioni dei dati di shuffle e le dimensioni dell'RDD memorizzato 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 il rendimento o la convenienza.
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 true, attiva il calcolo dinamico del timeout per gli esecutori che contengono dati di shuffle.
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ù rapidamente, mentre gli esecutori
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 shuffle
dal driver Spark dopo che un recupero da un esecutore ritirato a causa dell'allocazione dinamica di Spark
non è riuscito. In questo modo si riducono gli errori
ExecutorDeadException causati dalla migrazione dei blocchi di shuffle
dagli esecutori ritirati agli esecutori attivi e si riducono i tentativi di ripetizione delle fasi
causati dagli errori FetchFailedException (vedi
FetchFailedException causato da
ExecutorDeadException).
Questa proprietà è disponibile nelle versioni del runtime Spark di Managed Service for Apache Spark
1.1.12 e successive e 2.0.20 e successive. |
false |
spark.scheduler.excludeShuffleSkewExecutors |
Se true, evita di pianificare le attività sugli esecutori con distorsione dello shuffle, ovvero gli esecutori che hanno una grande quantità di dati di shuffle o un numero elevato di attività map completate. In questo modo è possibile migliorare il rendimento mitigando la distorsione 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 il rendimento o la convenienza. 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 ridotto 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 di Spark (per ulteriori informazioni sulle metriche Spark, vedi 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 le attività. |
Problemi e soluzioni di allocazione dinamica di Spark
FetchFailedException causato da ExecutorDeadException
Causa: quando l'allocazione dinamica di Spark riduce un esecutore, il file di shuffle viene migrato agli esecutori attivi. Tuttavia, poiché l'attività di riduzione di Spark su un esecutore 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 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 di Managed Service for Apache Spark (vedi Impostare le proprietà del workload batch Spark). Quando questa proprietà è attivata, l'attività di riduzione recupera la posizione dell'output di shuffle dal driver dopo che un recupero da un esecutore ritirato non è riuscito.