为啥会创建一个名为 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 数据工厂使用 AppendFile 而不是 PutBlob 将文件写入 Blob 存储容器?
如何使用数据工厂将 IoT 中心存储的 blob 复制到 Azure SQL
在 Azure Blob 容器中创建两个文件时,如何在 Azure 数据工厂中创建事件触发器?