Lange Spark-fase met één taak

Een langlopende fase met slechts één taak kent geen parallelisme. Terwijl de taak draait, doet één CPU het werk en kan de rest van de cluster inactief zijn. Workers toevoegen helpt niet, want Spark kan het werk niet over hen verspreiden.

Gebruik deze pagina wanneer de langste fase precies één taak heeft. Als de fase veel tasks heeft, controleer deze dan op skew en spill. Kijk naar Skew en spill.

Veelvoorkomende oorzaken en oplossingen

Een single-task-fase heeft meestal een van deze oorzaken. Zoek degene die bij jouw code past, en pas dan de oplossing toe:

  • Een dure UDF op small data. Kleine input kan in één partitie terechtkomen, dus één taak draait de hele UDF. Herschrijf de UDF met native functies als dat kan. Anders moet je repartition() de DataFrame transformeren voordat je de UDF toepast. Zie Langzame UDF's.
  • Een vensterfunctie zonder PARTITION BY. Zonder clausule PARTITION BY beslaat het venster de hele dataset, dus één taak verwerkt elke rij. Voeg een PARTITION BY clausule toe als je logica dat toelaat.
  • Een niet-splitsbaar bestandstype. Spark kan geen bestanden zoals gzip-bestanden die uit meerdere delen bestaan lezen, dus één grote taak leest elk bestand. Als je dezelfde bestanden herhaaldelijk leest, laad ze dan één keer in een Delta Lake-tabel en raadpleeg in plaats daarvan de tabel.
  • De optie multiLine bij JSON- of CSV-lezingen. Stel multiLine alleen in wanneer records meerdere regels beslaan. Zie Lees meerlijnige JSON-bestanden.
  • Schema-inferentie op een groot bestand. Specificeer het schema in plaats van het af te leiden. Zie Specificeer een schema.
  • repartition(1) of coalesce(1). Deze zorgen ervoor dat alle data in één partitie terechtkomen. Verwijder ze, of gebruik meer partities, tenzij je één uitvoerbestand nodig hebt.