为啥会创建一个名为 Azure Blob 存储容器内文件夹名称的空文件?

Posted

技术标签:

【中文标题】为啥会创建一个名为 Azure Blob 存储容器内文件夹名称的空文件?【英文标题】:Why is an empty file with the name of folder inside a Azure Blob storage container is created?为什么会创建一个名为 Azure Blob 存储容器内文件夹名称的空文件? 【发布时间】:2019-03-23 04:22:23 【问题描述】:

我正在通过 HD Insight 按需集群运行 Hive QL,该集群执行以下操作

    从 Hive 视图假脱机数据 在 Blob 存储容器中按名称 abcd 创建一个文件夹 命名为 XYZ 将视图数据存储在 abcd 文件夹内的文件中

但是,当运行 hive QL 时,会在 abcd 文件夹之外创建一个名为 abcd 的空文件

知道为什么会发生这种情况以及我们如何阻止它发生。请推荐

谢谢,

苏利亚

【问题讨论】:

我在安装到 spark 集群数据块上的 blob 存储时遇到了同样的问题。它似乎是通过通过 sh 或 shutil 而不是通过 dbutils 访问(或写入,两者都发生)dbfs 来触发的。有谁知道他为什么会发生?以及如何预防?通过 sh 看不到空文件,因此可能与内核处理文件系统操作的方式有关? 我也被这个问题困扰,我们在spark中使用它,这个问题破坏了我们的spark历史服务器,文件夹中的文件名为空。 【参考方案1】:

您得到这个是因为您正在装载的 Azure 存储没有分层文件系统。例如,挂载是 StorageV2 类型的 blob 存储,但您在创建时没有勾选使用分层文件系统。具有分层文件系统的第 2 版 blob 称为 Azure Data Lake Storage 第 2 代 (ADLS Gen2),它们基本上消除了 ADLS 第 1 代与旧 blob 代的 blob - 湖差异。

根据您使用的 blob API,即使您没有分层 FS,也会使用许多技巧来给您一种分层 FS 的错觉。就像创建空文件或隐藏文件一样。主要是层次结构是扁平的(即没有),所以你不能只创建一个空文件夹,你必须在那里放一些东西。

例如,如果您在 Databricks 中使用 wasbs:// 驱动程序挂载 v2 blob,然后从 %sh 单元格执行 mkdir -p /dbfs/mnt/mymount/this/is/a/path,您将看到如下内容:

this 文件夹,this 空文件 this/is 文件夹,this/is 空文件 等

最后,虽然这是 Azure blob 本身的完美文件,但它可能会给其他任何意想不到的东西带来麻烦,甚至是 %sh ls

只需将存储重新创建为 ADLS Gen2,或实时更新它以启用分层 FS。

谢谢,

【讨论】:

以上是关于为啥会创建一个名为 Azure Blob 存储容器内文件夹名称的空文件?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 门户在存储帐户中创建 Blob 容器时出错

为啥 Azure 数据工厂使用 AppendFile 而不是 PutBlob 将文件写入 Blob 存储容器?

如何使用数据工厂将 IoT 中心存储的 blob 复制到 Azure SQL

在 Azure Blob 容器中创建两个文件时,如何在 Azure 数据工厂中创建事件触发器?

Microsoft Azure:如何在 blob 容器中创建子目录

Azure SQL 导出无法在 Blob 容器中备份