無法讀取文件和目錄列表WASB文件係統

學習如何解釋錯誤發生在訪問WASB附加在磚blob類型。

寫的亞當Pavlacka

去年發表在:2022年6月1日

問題

當你試著讀一個文件在WASB火花,得到以下異常:

org.apache.spark。SparkException:工作階段失敗而終止:任務0階段1.0失敗了4次,最近的失敗:在舞台上失去了任務0.3 1.0 (10.139.64.5 TID 19日,執行人0):shaded.databricks.org.apache.hadoop.fs.azure.AzureException: com.microsoft.azure.storage。StorageException: Blob類型不正確,請使用正確的Blob類型來訪問服務器上的一個Blob。預計BLOCK_BLOB,實際APPEND_BLOB。

當你嚐試在WASB使用清單文件dbutils.fs.ls或Hadoop API,得到以下異常:

. io .FileNotFoundException:文件/ < some-directory >並不存在。

導致

WASB文件係統支持三種類型的斑點:塊,頁麵,添加。

  • 塊斑點是優化上傳大的數據塊在Hadoop(默認)。
  • 頁麵blob優化隨機讀和寫操作。
  • 附加blob附加操作的優化。

看到理解塊斑點,附加blob和頁麵blob獲取詳細信息。

上述錯誤發生如果你想讀一個blob或附加一個目錄列表隻包含附加blob。磚和Hadoop AzureWASB實現不支持閱讀附加blob。同樣當清單目錄,添加氣泡將被忽略。

沒有解決方法,使閱讀附加blob或清單目錄隻包含附加blob。不過,您可以使用Azure CLI或存儲Azure SDK Python來確定如果一個目錄包含blob或附加文件是一個附加的團。

您可以驗證是否通過運行以下目錄包含附加blob Azure CLI命令:

阿茲存儲blob列\——auth-mode關鍵\帳戶名稱<帳戶名稱> \——容器名稱<容器名稱> \——prefix <路徑>

返回的結果是作為一個JSON文檔,你可以很容易地找到blob類型為每個文件。

如果目錄是大,你可以限製數量的結果與國旗——num-results < num >

您還可以使用Azure存儲SDK Python和探索WASB文件係統中的文件列表:

% python iter = service.list_blobs iter (blob“容器”):如果blob.properties。blob_type = =“AppendBlob”:打印(“\ t Blob名稱:% s, % s“% (blob.name blob.properties.blob_type))

磚不支持訪問附加blob使用Hadoop API,但隻有當追加到一個文件。

解決方案

沒有解決這個問題。

使用Azure CLI或存儲Azure SDK Python來確定如果目錄包含附加blob或對象是一個附加的團。

您可以實現一個火花SQL UDF或自定義函數使用抽樣API加載,閱讀,或將氣泡對Python使用Azure存儲SDK。