使用 Azure Java SDK V12 和 ListBlobs() 在 Azure Blobstorage 中列出 Blob 非常慢

Posted

技术标签:

【中文标题】使用 Azure Java SDK V12 和 ListBlobs() 在 Azure Blobstorage 中列出 Blob 非常慢【英文标题】:Listing blobs in Azure Blobstorage using Azure Java SDK V12 and ListBlobs() is extremely slow 【发布时间】:2020-11-25 18:20:23 【问题描述】:

我需要列出 Azure Blobstorage 容器中的所有 Blob。容器中有大约 200,000~ 个 blob,我正在寻找 blob 名称、最后修改日期和 blob 大小。

按照 Azure Java SDK V12 的文档,以下代码应该可以工作:

BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(AzureBlobConnectionString).buildClient();
String containerName = "container1";
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
System.out.println("\nListing blobs...");

// List the blob(s) in the container.
for (BlobItem blobItem : containerClient.listBlobs()) 
  System.out.println("\t" + blobItem.getName());

但是,当执行此应用程序时,它似乎无限期地挂起。如果我打开 Powershell 并运行以下命令:

Get-AzStorageBlob -Container container1 -Context $ctx

我在大约 3 分钟内得到了预期的结果。

我已经给出了一个多小时的代码示例来执行,但没有任何结果。我试图根据文档限制请求的数据,并设置 5 分钟的超时时间:

BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(AzureBlobConnectionString).buildClient();
String containerName = "container1";
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
System.out.println("\nListing blobs...");

ListBlobsOptions options = new ListBlobsOptions()
        .setMaxResultsPerPage(10)
        .setDetails(new BlobListDetails()
                .setRetrieveDeletedBlobs(false)
                .setRetrieveSnapshots(true));
Duration duration = Duration.ofMinutes(5);
containerClient.listBlobs(options, duration).forEach(blob ->
        System.out.printf("Name: %s, Directory? %b, Deleted? %b, Snapshot ID: %s%n",
                blob.getName(),
                blob.isPrefix(),
                blob.isDeleted(),
                blob.getSnapshot()));

但是这导致它超时,但异常:

Exception in thread "main" reactor.core.Exceptions$ReactiveException: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 300000ms in 'flatMap' (and no fallback has been configured)
at reactor.core.Exceptions.propagate(Exceptions.java:366)
at reactor.core.publisher.BlockingIterable$SubscriberIterator.hasNext(BlockingIterable.java:168)
at java.lang.Iterable.forEach(Iterable.java:74)
at AzureManagement.AzureControl.listAllBlobs(AzureControl.java:42)
at Main.main(Main.java:8)

我知道曾经有一个名为“listBlobsSegmented”的方法,但是这似乎不在 Azure SDK for Java 的 V12 中。

如果有人对如何以有效和高效的方式获取容器中的 blob 列表有任何想法,我将不胜感激!

谢谢。

【问题讨论】:

请启用存储日志并检查日志以获取错误消息:docs.microsoft.com/en-us/azure/storage/common/… 【参考方案1】:

我遇到了完全相同的问题,即永远挂起的任何操作。实际上,您列出 blob 的方式没有问题。

原来是依赖冲突问题,确保你的依赖与 Azure SDK 没有冲突。这看起来很奇怪,但是当我们将 Azure SDK 版本从 12 降级到旧版本时我们发现了这一点,而不是挂起它会引发类似 method not found in class ...

的异常

就我而言,冲突来自hadoop-hdfs,它强制使用旧版本的netty。虽然 Azure SDK 需要更新版本的 netty

当我删除 HDFS 依赖项时: group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '3.2.0' 我可以列出文件和 blob 而不会出现挂起问题。

【讨论】:

以下是识别和解决问题的详细步骤列表:***.com/a/60589738/5765606

以上是关于使用 Azure Java SDK V12 和 ListBlobs() 在 Azure Blobstorage 中列出 Blob 非常慢的主要内容,如果未能解决你的问题,请参考以下文章

上传大文件 Azure Blob .net SDK v12 问题

如何使用 JavaScript v12 SDK for Browsers 检索和显示(在浏览器中)存储在 Azure 存储帐户中的多个 pdf 的 URL

与 v11 相比,使用 v12 将文件上传到 Azure Blob 存储 SDK 的 ASP.NET Core 使用更高的内存

如何使用最新的 Azure SDK .NET API v12 在 Blob 上获取共享访问签名?

如何从适用于 Node.js 的 Azure blob v12 SDK 中删除 blob

如何使用 Java SDK v12 删除 Blob 文件夹