Scalabilità automatica di Serverless per Apache Spark

Questo documento fornisce informazioni sulla scalabilità automatica di Google Cloud Serverless per Apache Spark. Quando invii il workload Spark, Serverless per 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 Serverless per 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 Serverless per Apache Spark V2

La versione 2 (V2) della scalabilità automatica di Serverless per Apache Spark aggiunge funzionalità e miglioramenti alla versione 1 (V1) predefinita per aiutarti a gestire i workload di Serverless per 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, Serverless per Apache Spark riduce le risorse del workload senza attendere che tutti i nodi completino la migrazione dello shuffle. Ciò significa che i nodi a coda lunga che eseguono 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 eseguire prima lo scale down. Questo algoritmo considera fattori come le dimensioni dei dati di shuffle del nodo e il tempo di inattività.
  • Comportamento configurabile di ritiro gestito automaticamente e migrazione dello shuffle di Spark: la scalabilità automatica V2 consente di utilizzare le proprietà Spark standard per configurare il ritiro gestito automaticamente e la migrazione dello shuffle di Spark. Questa funzionalità può aiutare a mantenere la compatibilità della migrazione con le proprietà Spark personalizzate.

Funzionalità di scalabilità automatica di Serverless per Apache Spark

Funzionalità Scalabilità automatica di Serverless per Apache Spark V1 Scalabilità automatica di Serverless per Apache Spark V2
Riduzione dei nodi Sincrona Asincrona
Selezione dei nodi per la riduzione Casuale Intelligente
Ritiro gestito automaticamente e migrazione dello shuffle di Spark 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 (scopri come impostare le proprietà di Spark).

Proprietà Descrizione Predefinito
spark.dataproc.scaling.version La versione di scalabilità automatica di Spark di Serverless per Apache Spark. Specifica la versione 1 o 2 (vedi Scalabilità automatica di Serverless per Apache Spark V2). 1
spark.dynamicAllocation.enabled Indica 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 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.reducer.fetchMigratedShuffle.enabled Se impostata su true, consente di recuperare la posizione dell'output dello shuffle dal driver Spark dopo che un recupero non è riuscito da un esecutore 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 agli esecutori attivi e si riducono i tentativi di ripetizione dello stage causati dagli errori FetchFailedException (vedi FetchFailedException causato da ExecutorDeadException). Questa proprietà è disponibile nelle versioni del runtime Spark di Serverless per Apache Spark 1.1.12 e successive e 2.0.20 e successive. false

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 di 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 dello 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 dello shuffle da un esecutore ritirato, causando ExecutorDeadException e FetchFailedException errori.

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