Un fichier référencé dans le journal des transactions est introuvable

Problème

Votre travail échoue avec un message d’erreur : A file referenced in the transaction log cannot be found.

Exemple de trace de pile :

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

Cause

Ce message d’erreur peut s’afficher pour trois raisons courantes.

  • Cause 1 : Vous démarrez le travail de streaming Delta, mais avant le début du traitement du travail de streaming, les données sous-jacentes sont supprimées.
  • Cause 2 : Vous effectuez des mises à jour de la table Delta, mais les fichiers des transactions ne sont pas mis à jour avec les informations les plus récentes.
  • Cause 3 : Vous tentez d’effectuer des opérations de lecture ou de mise à jour multiclusters sur la même table Delta, ce qui a pour résultat qu’un cluster fait référence à des fichiers sur un cluster qui a été supprimé et recréé.

Solution

  • 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 2 : Attendez que les données soient chargées, puis actualisez la table. Vous pouvez aussi exécuter fsck pour mettre à jour les fichiers des transactions avec les informations les plus récentes.

Notes

fsck supprime les entrées de fichier qui sont introuvables dans le système de fichiers sous-jacent du journal des transactions d’une table Delta.

  • Cause 3 : Quand des tables ont été supprimées et recréées, le cache des métadonnées du pilote est incorrect. Vous ne devez pas supprimer une table, vous devez toujours remplacer une table. Si vous supprimez une table, vous devez effacer le cache des métadonnées pour éviter le problème. Vous pouvez utiliser une commande de notebook Python ou Scala pour effacer le cache.
spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()
com.databricks.sql.transaction.tahoe.DeltaLog.clearCache()