Вывод больших двоичных объектов в Azure Blobstorage с помощью Azure Java SDK V12 и ListBlobs () происходит очень медленно

Мне нужно перечислить все большие двоичные объекты в контейнере хранилища BLOB-объектов Azure. В контейнере содержится около 200 000 больших двоичных объектов, и я хочу получить имя большого двоичного объекта, дату последнего изменения и размер большого двоичного объекта.

Следуя документации для 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, но его нет в версии 12 пакета Azure SDK для Java.

Если у кого-нибудь есть идеи относительно того, как получить список блобов в контейнере эффективным и действенным способом, я был бы очень признателен!

Спасибо.


person Compy    schedule 05.08.2020    source источник
comment
Включите журнал хранилища и проверьте журнал, чтобы получить сообщение об ошибке: docs.microsoft.com/en-us/azure/storage/common/   -  person Jim Xu    schedule 06.08.2020


Ответы (1)


Столкнулся с точно такой же проблемой любой операции зависнуть навсегда. На самом деле у вас нет проблем с тем, как вы перечисляете капли.

Оказалось, что это проблема конфликта зависимостей, убедитесь, что в ваших зависимостях нет конфликта с помощью Azure SDK. Это кажется странным, но мы обнаружили это, когда понизили версию пакета SDK для Azure с 12 до более старой версии, вместо того, чтобы вешать ее, вызывая исключение типа method not found in class ...

в моем случае конфликт возник из hadoop-hdfs, что заставляет старую версию netty. Хотя пакету Azure SDK требуется более новая версия netty.

Когда я удалил зависимость HDFS: group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '3.2.0' Я могу перечислить файлы и капли без проблем с зависанием.

person Mahmoud Yusuf    schedule 09.09.2020
comment
Вот подробный список шагов по выявлению и решению проблемы: stackoverflow.com/a/60589738/5765606 - person hareluya86; 27.10.2020