代码之家  ›  专栏  ›  技术社区  ›  m1nkeh

Databricks列出Azure Blob存储中的所有Blob

  •  1
  • m1nkeh  · 技术社区  · 6 年前

    我在Databricks中安装了一个Blob存储帐户,可以很好地访问它,所以我知道它是有效的。

    不过,我想做的是列出给定路径中所有文件的名称。。目前我正在做这件事:

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

    但我的问题是,它非常慢。。由于该位置大约有160000个blob(storage explorer显示为~1016106592字节,即1Gb!)

    这当然不可能把所有这些数据都拉下来,我需要/想要的只是文件名。。

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

    谢谢。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Peter Pan    6 年前

    根据我的经验并基于我对Azure Blob存储的理解,SDK中的所有操作或Azure Blob存储上的其他操作都将转换为RESTAPI调用。所以你的 dbutils.fs.ls 调用实际上是调用相关的restapi List Blobs 在 水滴容器。

    因此,我敢肯定你的代码的性能瓶颈确实是由传输的数据量大小的影响 XML Blob存储上Blob列表的响应主体,用于将Blob名称提取到 list 可变的,甚至有大约160000个斑点。

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

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