找不到事務日誌中引用的文件

找不到事務日誌中引用的文件。這種情況發生在手動從文件係統中刪除數據而不是使用表' DELETE '語句時。

寫的亞當Pavlacka

最後發布日期:2022年5月10日

問題

你的作業失敗了,出現錯誤信息:找不到事務日誌中引用的文件

示例堆棧跟蹤:

SQL語句錯誤:SparkException: Job aborted due to stage failure: Task 0 in stage 6.0 failed 4次,最近一次失敗:Lost Task 0.3 in stage 6.0 (TID 106, XXX.XXX.XXX. xxx .)XXX, executor 0): com.databricks.sql.io.FileReadException: Error while reading file dbfs:/mnt//part-00000-da504c51-3bb4-4406-bb99-3566c0e2f743-c000.snappy.parquet。找不到事務日誌中引用的文件。這種情況發生在手動從文件係統中刪除數據而不是使用表' DELETE '語句時。欲了解更多信息,請參閱https://docs.www.eheci.com/delta/delta-intro.html#frequently-asked-questions…原因:java.io.FileNotFoundException: dbfs:/mnt//part-00000-da504c51-3bb4-4406-bb99-3566c0e2f743-c000.snappy。拚花……

導致

此錯誤消息有三個常見原因。

  • 原因1:啟動Delta流作業,但在流作業開始處理之前,底層數據被刪除。
  • 原因2:對Delta表執行更新,但事務文件沒有更新最新的詳細信息。
  • 原因3:在同一個Delta表上嚐試多集群讀或更新操作,導致集群引用已刪除和重新創建的集群上的文件。

解決方案

  • 原因1:您應該使用一個新的檢查點目錄,或設置Spark屬性spark.sql.files.ignoreMissingFiles為true火花配置
  • 原因2:等待數據加載,然後刷新表。你也可以跑fsck用最新的細節更新交易文件。
刪除

信息

fsck從Delta表的事務日誌中刪除底層文件係統中無法找到的任何文件條目。

  • 原因3:刪除並重新創建表後,驅動中的元數據緩存不正確。你不應該刪除一個表,你應該總是覆蓋一個表。如果確實刪除了表,則應該清除元數據緩存以緩解問題。您可以使用Python或Scala notebook命令來清除緩存。
% python spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache ()
% scala com.databricks.sql.transaction.tahoe.DeltaLog.clearCache ()