Impossible de trouver un fichier référencé dans le journal des transactionsA file referenced in the transaction log cannot be found

ProblèmeProblem

Votre travail échoue avec un message d’erreur : A file referenced in the transaction log cannot be found.Your job fails with an error message: A file referenced in the transaction log cannot be found.

Exemple de trace de la pile :Example 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 ...

CauseCause

Il existe trois causes courantes pour ce message d’erreur.There are three common causes for this error message.

  • Cause 1: vous démarrez la tâche de streaming Delta, mais avant le début du traitement du travail de diffusion en continu, les données sous-jacentes sont supprimées.Cause 1: You start the Delta streaming job, but before the streaming job starts processing, the underlying data is deleted.
  • Cause 2: vous effectuez des mises à jour de la table Delta, mais les fichiers de transaction ne sont pas mis à jour avec les informations les plus récentes.Cause 2: You perform updates to the Delta table, but the transaction files are not updated with the latest details.
  • Cause 3: vous tentez d’effectuer des opérations de lecture ou de mise à jour sur plusieurs clusters sur la même table Delta, ce qui se traduit par un cluster qui fait référence à des fichiers sur un cluster qui a été supprimé et recréé.Cause 3: You attempt multi-cluster read or update operations on the same Delta table, resulting in a cluster referring to files on a cluster that was deleted and recreated.

SolutionSolution

  • Cause 1: vous devez utiliser un nouveau répertoire de point de contrôle ou définir la propriété Spark spark.sql.files.ignoreMissingFiles sur true dans la configuration Spark du cluster.Cause 1: You should use a new checkpoint directory, or set the Spark property spark.sql.files.ignoreMissingFiles to true in the cluster’s Spark Config.
  • Cause 2: attendez que les données soient chargées, puis actualisez la table.Cause 2: Wait for the data to load, then refresh the table. Vous pouvez également exécuter fsck pour mettre à jour les fichiers de transaction avec les informations les plus récentes.You can also run fsck to update the transaction files with the latest details.

Notes

fsck supprime toutes les entrées de fichier qui ne se trouvent pas dans le système de fichiers sous-jacent du journal des transactions d’une table Delta.fsck removes any file entries that cannot be found in the underlying file system from the transaction log of a Delta table.

  • Cause 3: lorsque des tables ont été supprimées et recréées, le cache des métadonnées du pilote est incorrect.Cause 3: When tables have been deleted and recreated, the metadata cache in the driver is incorrect. Vous ne devez pas supprimer une table, vous devez toujours remplacer une table.You should not delete a table, you should always overwrite a table. Si vous supprimez une table, vous devez effacer le cache des métadonnées pour atténuer le problème.If you do delete a table, you should clear the metadata cache to mitigate the issue. Vous pouvez utiliser une commande de bloc-notes python ou Scala pour effacer le cache.You can use a Python or Scala notebook command to clear the cache.
spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()
com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()