FileReadException当阅读三角洲表

FileReadException错误发生在您试图从三角洲表读取。底层数据已被删除,或者存储blob写时被卸载。

写的亚当Pavlacka

去年发表在:2023年2月23日

问题

您试图从挂载存储和读取三角洲表得到FileReadException错误。

FileReadException:当abfss阅读文件时发生错误:redacted@redacted.dfs.core.windows.net/redacted/redacted/redacted/redacted/partition=redacted/part - 00042 - 0725 - ec45 - 5 - c32 - 412 a - ab27 5 - bc88c058773.c000.snappy.parquet。事务日志中引用一个文件无法找到。这发生在手动数据从文件系统中删除表,而不是使用“删除”声明。有关更多信息,请参见https://docs.microsoft.com/azure/databricks/delta/delta-intro常见问题引起的:FileNotFoundException:操作失败:指定的路径不存在。头”,404年,https:// REDACTED.dfs.core.windows.net/编辑/编辑/编辑/编辑/分区=修订/部分- 00042 - 0725 - ec45 - 5 - c32 - 412 a - ab27 5 - bc88c058773.c000.snappy.parquet ? upn =误动作= getStatus&timeout = 90

导致

FileReadException错误发生在底层数据不存在。最常见的原因是手动删除。

如果没有手动删除,底层数据存储blob的挂载点删除并重新创建,而集群正在写三角洲表。

三角洲湖不失败表写如果删除位置,而数据写正在进行。相反,创建一个新文件夹的默认存储账户的工作区中,删除相同的路径。数据仍然是写在这个位置。

如果山重新在写操作完成后,再次和δ事务日志可用,三角洲更新事务日志和写被认为是成功的。,当这一切发生的时候,数据文件写入默认存储帐户在山删除无法访问,为当前路径引用挂载的存储位置。

删除

信息

您可以使用诊断日志记录来验证了山。查询DBFS表卸载事件。

例如:

DatabricksDBFS | ActionName = =“卸载”或ActionName = =“山”

解决方案

你可以恢复丢失的数据两种方式中的一种。

  • 修复三角洲表并添加丢失的数据用一个自定义的工作。
  1. 使用FSCK修复。
    % sql FSCK修理表<表名称>
  2. 重写缺失数据的自定义工作。这个选项是一个很好的选择,如果您可以重新运行的最后一份工作也不用担心重复数据。
  • 手动恢复丢失的文件。
  1. 确认没有活跃的工作读写挂载的存储账户包含δ表。
  2. 卸载安装路径。这允许您访问/ mnt / < path-to-table >目录默认存储账户。
    % python dbutils.fs.unmount (“/ mnt / < mount-containing-table >”)
  3. 使用dbutils.fs.mv移动文件位于表的路径到一个临时位置。
    python dbutils.fs %。mv (“/ mnt / < path-to-table >”,“/ tmp / tempLocation /”,真的))
  4. 重新创建挂载点。
    python dbutils.fs %。山(source = "abfss://@.dfs.core.windows.net/", mount_point = "/mnt/", extra_configs = configs)
    检查访问数据存储Gen2湖和blob存储Azure文档的更多信息。
  5. 从临时位置移动文件到三角洲表更新路径。
    python dbutils.fs %。mv (“/ tmp / tempLocation”、“/ mnt / < path-to-table >”,真的))

如果任何工作读写挂载点当你尝试手动恢复你可能导致这个问题再次发生。验证山不是在使用之前手动修复。

最佳实践

  • 指导用户存储位置卸载前获得批准。
  • 如果你必须卸载一个存储位置,确认没有在集群上运行工作。
  • 使用dbutils.fs.updateMount更新的信息。不要使用卸载更新安装。
  • 使用诊断日志记录来识别任何可能卸载问题。
  • 生产运行工作只在工作集群为不受临时卸载命令在运行,除非他们运行dbutils.fs.refreshMounts命令。
  • 交互式集群上运行作业时,添加一个验证步骤的工作(比如一个计数)检查缺失的数据文件。如果缺少任何一个错误立即触发。



这篇文章有用吗?