Det går inte att hitta en fil som refereras till i transaktionsloggen

Problem

Jobbet misslyckas med ett felmeddelande: A file referenced in the transaction log cannot be found.

Exempel på stackspårning:

Error in SQL statement: SparkException: Job aborted due to stage failure: Task 0 in stage 6.0 failed 4 times, most recent failure: Lost task 0.3 in stage 6.0 (TID 106, XXX.XXX.XXX.XXX, executor 0): com.databricks.sql.io.FileReadException: Error while reading file dbfs:/mnt/<path>/part-00000-da504c51-3bb4-4406-bb99-3566c0e2f743-c000.snappy.parquet. A file referenced in the transaction log cannot be found. This occurs when data has been manually deleted from the file system rather than using the table `DELETE` statement. For more information, see https://docs.databricks.com/delta/delta-intro.html#frequently-asked-questions ... Caused by: java.io.FileNotFoundException: dbfs:/mnt/<path>/part-00000-da504c51-3bb4-4406-bb99-3566c0e2f743-c000.snappy.parquet ...

Orsak

Det finns tre vanliga orsaker till det här felmeddelandet.

  • Orsak 1:Du startar deltaströmningsjobbet, men innan strömningsjobbet börjar bearbetas tas underliggande data bort.
  • Orsak 2:Du utför uppdateringar av deltatabellen, men transaktionsfilerna uppdateras inte med den senaste informationen.
  • Orsak 3:Du försöker läsa eller uppdatera flera kluster i samma Delta-tabell, vilket resulterar i ett kluster som refererar till filer i ett kluster som har tagits bort och återskapats.

Lösning

  • Orsak 1:Du bör använda en ny kontrollpunktskatalog eller ange Spark-egenskapen till true i klustrets true
  • Orsak 2:Vänta tills data har läses in och uppdatera sedan tabellen. Du kan också köra fsck för att uppdatera transaktionsfilerna med den senaste informationen.

Anteckning

fsck tar bort alla filposter som inte kan hittas i det underliggande filsystemet från transaktionsloggen för en Delta-tabell.

  • Orsak 3:När tabeller har tagits bort och återskapats är metadatacachen i drivrutinen felaktig. Du bör inte ta bort en tabell, du bör alltid skriva över en tabell. Om du tar bort en tabell bör du rensa metadatacachen för att åtgärda problemet. Du kan använda ett Python- eller Scala Notebook-kommando för att rensa cacheminnet.
spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()
com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()