事务日志中引用一个文件无法找到

事务日志中引用一个文件无法找到。这发生在手动数据从文件系统中删除表,而不是使用“删除”声明。

写的亚当Pavlacka

去年发表在:2022年5月10日

问题

你的工作失败,并显示一条消息:事务日志中引用一个文件无法找到

堆栈跟踪:

错误的SQL语句:SparkException:工作阶段失败而终止:任务0阶段6.0失败了4次,最近的失败:在舞台上失去了任务0.3 6.0 (TID 106 XXX.XXX.XXX。XXX,遗嘱执行人0):com.databricks.sql.io。FileReadException:读取文件时错误dbfs: / mnt / <路径> /部分- 00000 - da504c51 - 3 -所以- 4406 - bb99 - 3566 - c0e2f743 c000.snappy.parquet。事务日志中引用一个文件无法找到。这发生在手动数据从文件系统中删除表,而不是使用“删除”声明。有关更多信息,请参见https://docs.www.neidfyre.com/delta/delta-intro.html常见问题……引起的:java。FileNotFoundException: dbfs: / mnt / <路径> /部分- 00000 - da504c51 - 3 -所以- 4406 - bb99 - 3566 - c0e2f743 c000.snappy。拼花……

导致

有三种常见的原因为这个错误消息。

  • 原因1:你开始三角洲流工作,但流媒体工作开始前处理、底层数据被删除。
  • 原因2:你三角洲表进行更新,但事务文件没有更新最新的细节。
  • 原因3多集群:你尝试读取或更新操作在同一δ表,导致集群指文件删除并重新创建一个集群。

解决方案

  • 原因1:你应该使用一个新的检查点目录,或设置火花属性spark.sql.files.ignoreMissingFiles真正的集群中火花配置
  • 原因2:等待数据加载,然后刷新表。您还可以运行fsck更新事务文件的最新细节。
删除

信息

fsck删除任何文件条目在底层文件系统不能发现从三角洲的事务日志表。

  • 原因3:当表被删除并重新创建,元数据缓存的司机是不正确的。你不应该删除一个表,你应该总是覆盖一个表。如果你删除一个表,你应该清楚的元数据缓存来缓解这个问题。您可以使用Python或Scala笔记本命令来清除缓存。
% python spark._jvm.com.databricks.sql.transaction.tahoe.DeltaLog.clearCache ()
% scala com.databricks.sql.transaction.tahoe.DeltaLog.clearCache ()


这篇文章有用吗?