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命令。
  • 交互式集群上運行作業時,添加一個驗證步驟的工作(比如一個計數)檢查缺失的數據文件。如果缺少任何一個錯誤立即觸發。



這篇文章有用嗎?