【问题标题】:Databricks list all blobs in Azure Blob StorageDatabricks 列出 Azure Blob 存储中的所有 Blob
【发布时间】:2019-07-28 18:17:24
【问题描述】:

我已经在 Databricks 中安装了一个 Blob 存储帐户,并且可以正常访问它,所以我知道它可以工作。

我想做的是列出给定路径中所有文件的名称..目前我正在这样做:

list = dbutils.fs.ls('dbfs:/mnt/myName/Path/To/Files/2019/03/01')
df = spark.createDataFrame(list).select('name')

但我遇到的问题是,它非常慢......因为该位置大约有 160,000 个 blob(存储资源管理器将其显示为 ~1016106592 字节,即 1Gb!)

这肯定不能拉下所有这些数据,我需要/想要的只是文件名..

blob 存储是我的瓶颈,还是我可以(以某种方式)让 Databricks 并行执行命令之类的?

谢谢。

【问题讨论】:

    标签: python azure azure-blob-storage azure-databricks


    【解决方案1】:

    根据我的经验和对 Azure Blob 存储的理解,SDK 中的所有操作或 Azure Blob 存储上的其他操作都将转换为 REST API 调用。所以你的dbutils.fs.ls调用实际上是调用相关的REST APIList Blobs 斑点容器。

    因此,我确信您的代码的性能瓶颈确实受到了将 blob 存储上 blob 列表的 XML 响应主体的数量大小的数据传输以将 blob 名称提取到 list 变量的数据,甚至大约有 160,000 个 blob。

    同时,所有的 blob 名称都将包装在许多 XML 响应切片中,并且每个切片有一个 MaxResults 限制,并且获取下一个切片取决于前一个切片的 NextMarker 值。上面的原因就是为什么列出blob很慢,而且不能并行。

    我对提高加载blob列表效率的建议是提前缓存list blobs的结果,比如生成一个blob逐行写入blob列表。考虑到实时更新,您可以尝试使用Azure Function with Blob Trigger在发生blob创建事件时将blob名称记录添加到Append Blob。

    【讨论】:

    • 感谢您提供合理的回复,这不是一个坏主意.. 会试一试!
    • @m1nkeh 如果对您有帮助,您可以标记一下吗?谢谢。
    • 最后我实际上使用了 python blob 存储 SDK。它对我的用例来说已经足够快了:D
    猜你喜欢
    • 2012-03-02
    • 2019-08-17
    • 2021-08-31
    • 2019-06-09
    • 2019-03-08
    • 2021-07-11
    • 1970-01-01
    • 2021-12-21
    • 2019-04-16
    相关资源
    最近更新 更多