Fase Spark lunga con una sola attività

Una fase di lunga durata con un solo compito non ha parallelismo. Mentre il compito è in esecuzione, una CPU fa il lavoro e il resto del cluster potrebbe rimanere inattivo. Aggiungere worker non aiuta, perché Spark non può distribuire il lavoro tra di loro.

Usa questa pagina quando la fase più lunga ha esattamente una sola attività. Se la fase ha molte attività, controlla se presenta skew e spill. Vedere Inclinazione e spostamento.

Cause e correzioni comuni

Una fase a compito singolo ha più spesso una di queste cause. Trova quello che corrisponde al tuo codice e poi applica la correzione:

  • Un UDF costoso su dati di piccole dimensioni. Piccoli input possono finire in una singola partizione, quindi un compito gestisce l'intero UDF. Riscrivi la UDF usando funzioni native se puoi. Altrimenti, repartition() trasforma il DataFrame prima di applicare l'UDF. Vedi UDF lenti.
  • Una window function senza PARTITION BY. Senza una PARTITION BY clausola, la finestra copre l'intero dataset, quindi un compito elabora ogni riga. Aggiungi una PARTITION BY clausola se la tua logica lo permette.
  • Un tipo di file non divisibile. Spark non può leggere file come i file gzip in più parti, quindi un'unica attività di grandi dimensioni legge ogni file. Se leggi gli stessi file ripetutamente, inserili una volta in una tabella Delta Lake e consulta invece la tabella.
  • L'opzione multiLine per le letture JSON o CSV. Imposta multiLine solo quando i record coprono più linee. Vedi Leggere file JSON multi-riga.
  • Inferenza di schema su un file grande. Specifica lo schema invece di inferirlo. Vedi Specifica di uno schema.
  • repartition(1) o coalesce(1). Queste opzioni costringono tutti i dati in un'unica partizione. Rimuovili, oppure usa più partizioni, a meno che tu non abbia bisogno di un singolo file di output.