Er kan geen bestand worden gevonden waarnaar wordt verwezen in het transactielogboek

Probleem

Uw taak mislukt met een foutbericht: A file referenced in the transaction log cannot be found.

Voorbeeld van stack-trace:

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 ...

Oorzaak

Er zijn drie veelvoorkomende oorzaken voor dit foutbericht.

  • Oorzaak 1: U start de Delta-streaming-taak, maar voordat de streaming-taak begint met verwerken, worden de onderliggende gegevens verwijderd.
  • Oorzaak 2: u voert updates uit voor de Delta-tabel, maar de transactiebestanden worden niet bijgewerkt met de meest recente details.
  • Oorzaak 3: u probeert lees- of bij te werken bewerkingen voor meerdere clusters op dezelfde Delta-tabel, wat resulteert in een cluster dat verwijst naar bestanden op een cluster dat is verwijderd en opnieuw is gemaakt.

Oplossing

  • Oorzaak 1: U moet een nieuwe controlepuntmap gebruiken of de Spark-eigenschap instellen op in de spark.sql.files.ignoreMissingFiles true Spark-configuratie van het cluster.
  • Oorzaak 2: Wacht tot de gegevens zijn geladen en vernieuw vervolgens de tabel. U kunt ook uitvoeren om fsck de transactiebestanden bij te werken met de meest recente details.

Notitie

fsck verwijdert alle bestandsgegevens die niet kunnen worden gevonden in het onderliggende bestandssysteem uit het transactielogboek van een Delta-tabel.

  • Oorzaak 3: Wanneer tabellen zijn verwijderd en opnieuw zijn gemaakt, is de cache met metagegevens in het stuurprogramma onjuist. U moet een tabel niet verwijderen. U moet altijd een tabel overschrijven. Als u een tabel verwijdert, moet u de metagegevenscache wissen om het probleem te verhelpen. U kunt een Python- of Scala-notebookopdracht gebruiken om de cache te wissen.
spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()
com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()