Eine Datei, auf die im Transaktionsprotokoll verwiesen wird, kann nicht gefunden werden.

Problem

Ihr Auftrag schlägt mit einer Fehlermeldung fehl: A file referenced in the transaction log cannot be found.

Beispiel für die Stapelüberwachung:

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

Ursache

Es gibt drei häufige Ursachen für diese Fehlermeldung.

  • Ursache 1:Sie starten den Delta-Streamingauftrag, aber bevor der Streamingauftrag mit der Verarbeitung beginnt, werden die zugrunde liegenden Daten gelöscht.
  • Ursache 2:Sie führen Updates für die Delta-Tabelle durch, die Transaktionsdateien werden jedoch nicht mit den neuesten Details aktualisiert.
  • Ursache 3:Sie versuchen Lese- oder Aktualisierungsvorgänge mit mehreren Clustern für dieselbe Delta-Tabelle, was dazu führt, dass ein Cluster auf Dateien in einem Cluster verweist, der gelöscht und neu erstellt wurde.

Lösung

  • Ursache 1:Sie sollten ein neues Prüfpunktverzeichnis verwenden oder die Spark-Eigenschaft in der truetruedes Clusters auf festlegen.
  • Ursache 2:Warten Sie, bis die Daten geladen wurden, und aktualisieren Sie dann die Tabelle. Sie können auch fsck ausführen, um die Transaktionsdateien mit den neuesten Details zu aktualisieren.

Hinweis

fsck entfernt alle Dateieinträge, die im zugrunde liegenden Dateisystem nicht gefunden werden können, aus dem Transaktionsprotokoll einer Delta-Tabelle.

  • Ursache 3:Wenn Tabellen gelöscht und neu erstellt wurden, ist der Metadatencache im Treiber falsch. Sie sollten keine Tabelle löschen, sie sollten immer eine Tabelle überschreiben. Wenn Sie eine Tabelle löschen, sollten Sie den Metadatencache löschen, um das Problem zu beheben. Sie können einen Python- oder Scala Notebook-Befehl verwenden, um den Cache zu löschen.
spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()
com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()