[英]Listing blobs in Azure Blobstorage using Azure Java SDK V12 and ListBlobs() is extremely slow
我需要列出 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 的 V12 中,用于 ZD52387880E1EA22817A72D3759Z1。
如果有人对如何以有效和高效的方式获取容器中的 blob 列表有任何想法,我将非常感激!
谢谢。
我面临着永远挂起的任何操作的完全相同的问题。 实际上,您列出 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 而不会出现挂起问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.