为什么从 databricks spark notebook (hadoop fileUtils) 写入 DBFS 装载位置比写入 DBFS 根位置慢 13 倍?

Why write from databricks spark notebook ( hadoop fileUtils) to DBFS mount location is 13 times slower than write to DBFS Root location?

Databricks notebook 需要 2 小时才能写入 /dbfs/mnt(blob 存储)。 同样的工作需要 8 分钟才能写入 /dbfs/FileStore.

我想了解为什么两种情况下写入性能不同。 我还想知道 /dbfs/FileStor 使用哪个后端存储?

我知道 DBFS 是可扩展对象存储之上的抽象。 在这种情况下,/dbfs/mnt/blobstorage 和 /dbfs/FileStore/.

应该花费相同的时间

问题陈述:

源文件格式:.tar.gz

平均大小:10 mb

tar.gz 个文件的数量:1000

每个 tar.gz 文件包含大约 20000 个 csv 文件。

要求: 解压 tar.gz 文件并将 CSV 文件写入 blob 存储/中间存储层以供进一步处理。

解压并写入挂载位置(附截图):

我在这里使用 hadoop FileUtil 库和 unTar 函数来解压缩 CSV 文件并将其写入目标存储(/dbfs/mnt/ - blob 存储)。 使用 2 个工作节点(每个 4 个核心)集群完成作业需要 1.50 小时。

解压并写入 DBFS 根文件存储: 在这里,我使用 hadoop FileUtil 库和 unTar 函数来解压缩并将 CSV 文件写入目标存储 (/dbfs/FileStore/ ) 使用 2 个工作节点(每个 4 个核心)集群仅需 8 分钟即可完成作业。

问题: 为什么写入 DBFS/FileStore 或 DBFS/databricks/driver 比写入 DBFS/mnt 存储快 15 倍?

DBFS 根目录(/FileStore、/databricks-datasets、/databricks/driver)在后端使用什么存储和文件系统?每个子文件夹的大小限制是多少?

可能有多种因素影响,但需要更多信息进行调查:

  • 您的 /mnt 挂载点可能指向另一个区域中的 blob 存储,因此您的延迟更高
  • 您的 blob 存储正在受到限制,例如,如果有很多 reads/writes 或来自其他集群的列表操作 - 这可能会导致重试 Spark 任务(检查Spark UI 如果你有任何错误的任务)。另一方面,/FileStore 位于未加载的专用 blob 存储 (so-called DBFS Root) 中。

通常,对于 DBFS Root,使用 Azure Blob 存储,而不是 ADLS。具有分层命名空间的 ADLS 有额外的操作开销,因为它需要检查权限等。这也会影响性能。

但要解决该问题,最好打开支持票,因为它可能需要后端调查。

P.S。请注意,DBFS Root 应该只用于临时数据,因为它只能从工作区访问,所以你不能与其他工作区或其他消费者共享数据。