Problemen met Spark-geheugen

Wanneer executors zonder geheugen komen te zitten, verwijdert Spark ze en probeert het hun taken opnieuw uit te voeren. De taak vertraagt, en na herhaalde mislukkingen falen de fase en de taak.

Gebruik deze pagina wanneer taken falen of executors worden verwijderd en het gebeurtenislogboek van de compute geen spot- of preemptibele instance-verliezen of autoscaling toont. Om het gebeurtenislogboek te controleren, zie Mislukte taken of executors verwijderd. Als de fase is voltooid maar traag is en spill vertoont, zie dan Skew and spill.

Een geheugenprobleem verifiëren

Geheugenproblemen veroorzaken vaak fouten zoals:

SparkException: Job aborted due to stage failure: Task 3 in stage 0.0 failed 4 times, most recent failure: Lost task 3.3 in stage 0.0 (TID 30) (10.139.64.114 executor 4): ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages.

Deze fouten zijn vaak generiek, en andere problemen kunnen ze veroorzaken. Als je een geheugenprobleem vermoedt, verifieer dit dan door het geheugen per kern te verdubbelen om te zien of het probleem oplost.

Als het worker-type bijvoorbeeld 4 cores en 16 GB geheugen heeft, schakel dan over op een worker-type met 4 cores en 32 GB geheugen. Dat geeft je 8 GB per core in plaats van 4 GB. De verhouding van geheugen tot kernen is belangrijk, niet het totale geheugen. Als de taak langer duurt om te falen of helemaal niet faalt, kan het geheugen de oorzaak zijn.

Als meer geheugen het probleem oplost, houd dan het grotere worker-type. Als dat niet zo is, of als de extra kosten te hoog zijn, bekijk dan de mogelijke oorzaken in de volgende sectie.

Mogelijke oorzaken

Geheugenproblemen hebben vele mogelijke oorzaken. Begin met deze veelvoorkomende oorzaken:

  • Te weinig shuffle-partities. Stel spark.sql.shuffle.partitions in op auto zodat Spark het aantal shuffle-partities kiest. Zie AQE-configuratie.
  • Een grote uitzending. Controleer op broadcast join hints op grote tabellen en bekijk de runtime broadcast threshold. Zie AQE-configuratie.
  • UDFs. Elke taak die een UDF uitvoert, kan alle data uit zijn partitie in het geheugen laden. Herschrijf de UDF met native functies, of herpartitioneer voordat je het toepast. Zie Langzame UDF's.
  • Een vensterfunctie zonder PARTITION BY. Voeg een PARTITION BY clause toe zodat het venster niet de hele dataset overspant. Bekijk de lange Spark-fase met één taak.
  • Scheef. Controleer scheefheid in de samenvattingsmetingen van de fase. Zie Skew. Voor joins, zie Dynamisch omgaan met skew join.
  • Status van streaming. Voor queries die streaming state behouden, gebruik de RocksDB state store en beperk het geheugengebruik. Zie Cap RocksDB-geheugengebruik.