Скачивание больших объемов случайных данных из службы хранилища Azure

Это руководство представляет собой первую часть цикла. Из этого руководства можно узнать, как скачать большие объемы данных из службы хранилища Azure.

В третьей части цикла вы узнаете, как выполнять такие задачи:

  • Обновление приложения
  • Выполнение приложения
  • Проверка количества подключений.

Предварительные требования

Для работы с этим руководством необходимо изучить предыдущее руководство по использованию хранилища: Передача больших объемов случайных данных в параллельном режиме в службу хранилища Azure.

Удаленное подключение к виртуальной машине

Для создания сеанса удаленного рабочего стола с виртуальной машиной используйте следующую команду на вашем локальном компьютере. Замените IP-адрес значением publicIPAddress виртуальной машины. При появлении запроса введите учетные данные, использованные при создании виртуальной машины.

mstsc /v:<publicIpAddress>

Обновление приложения

Из предыдущего руководства вы узнали, как отправлять файлы в учетную запись хранения. Откройте D:\git\storage-dotnet-perf-scale-app\Program.cs в текстовом редакторе. Замените метод Main следующим примером. В этом примере комментируется задача отправки и расскомментируется задача скачивания, а также, по завершении, задача удаления содержимого в учетной записи хранения.

public static void Main(string[] args)
{
    Console.WriteLine("Azure Blob storage performance and scalability sample");
    // Set threading and default connection limit to 100 to 
    // ensure multiple threads and connections can be opened.
    // This is in addition to parallelism with the storage 
    // client library that is defined in the functions below.
    ThreadPool.SetMinThreads(100, 4);
    ServicePointManager.DefaultConnectionLimit = 100; // (Or More)

    bool exception = false;
    try
    {
        // Call the UploadFilesAsync function.
        // await UploadFilesAsync();

        // Uncomment the following line to enable downloading of files from the storage account.
        // This is commented out initially to support the tutorial at 
        // https://learn.microsoft.com/azure/storage/blobs/storage-blob-scalable-app-download-files
        await DownloadFilesAsync();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        exception = true;
    }
    finally
    {
        // The following function will delete the container and all files contained in them.
        // This is commented out initially as the tutorial at 
        // https://learn.microsoft.com/azure/storage/blobs/storage-blob-scalable-app-download-files
        // has you upload only for one tutorial and download for the other.
        if (!exception)
        {
            // await DeleteExistingContainersAsync();
        }
        Console.WriteLine("Press any key to exit the application");
        Console.ReadKey();
    }
}

После обновления приложения его снова необходимо создать. Откройте Command Prompt и перейдите к D:\git\storage-dotnet-perf-scale-app. Перестройте приложение, выполнив dotnet build, как показано в следующем примере:

dotnet build

Выполнение приложения

Перестроив приложение, можно запустить его с обновленным кодом. Откройте Command Prompt (если еще не сделали этого) и перейдите к D:\git\storage-dotnet-perf-scale-app.

Нажмите клавишу dotnet run, чтобы запустить приложение.

dotnet run

Задание DownloadFilesAsync, показано в следующем примере:

Приложение считывает контейнеры, расположенные в учетной записи хранения, указанной в storageconnectionstring. Оно проходит большие двоичные объекты по одному при помощи метода GetBlobs и скачивает их на локальный компьютер при помощи метода DownloadToAsync.

private static async Task DownloadFilesAsync()
{
    BlobServiceClient blobServiceClient = GetBlobServiceClient();

    // Path to the directory to upload
    string downloadPath = Directory.GetCurrentDirectory() + "\\download\\";
    Directory.CreateDirectory(downloadPath);
    Console.WriteLine($"Created directory {downloadPath}");

    // Specify the StorageTransferOptions
    var options = new StorageTransferOptions
    {
        // Set the maximum number of workers that 
        // may be used in a parallel transfer.
        MaximumConcurrency = 8,

        // Set the maximum length of a transfer to 50MB.
        MaximumTransferSize = 50 * 1024 * 1024
    };

    List<BlobContainerClient> containers = new List<BlobContainerClient>();

    foreach (BlobContainerItem container in blobServiceClient.GetBlobContainers())
    {
        containers.Add(blobServiceClient.GetBlobContainerClient(container.Name));
    }

    // Start a timer to measure how long it takes to download all the files.
    Stopwatch timer = Stopwatch.StartNew();

    // Download the blobs
    try
    {
        int count = 0;

        // Create a queue of tasks that will each upload one file.
        var tasks = new Queue<Task<Response>>();

        foreach (BlobContainerClient container in containers)
        {                     
            // Iterate through the files
            foreach (BlobItem blobItem in container.GetBlobs())
            {
                string fileName = downloadPath + blobItem.Name;
                Console.WriteLine($"Downloading {blobItem.Name} to {downloadPath}");

                BlobClient blob = container.GetBlobClient(blobItem.Name);

                // Add the download task to the queue
                tasks.Enqueue(blob.DownloadToAsync(fileName, default, options));
                count++;
            }
        }

        // Run all the tasks asynchronously.
        await Task.WhenAll(tasks);

        // Report the elapsed time.
        timer.Stop();
        Console.WriteLine($"Downloaded {count} files in {timer.Elapsed.TotalSeconds} seconds");
    }
    catch (RequestFailedException ex)
    {
        Console.WriteLine($"Azure request failed: {ex.Message}");
    }
    catch (DirectoryNotFoundException ex)
    {
        Console.WriteLine($"Error parsing files in the directory: {ex.Message}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Exception: {ex.Message}");
    }
}

Проверка подключений

Во время скачивания файлов можно проверить число одновременных подключений к учетной записи хранения. Откройте окно консоли и введите netstat -a | find /c "blob:https". Эта команда показывает количество подключений, которые открыты в настоящее время. Как видно из следующего примера, при скачивании файлов из учетной записи хранения было открыто более 280 подключений.

C:\>netstat -a | find /c "blob:https"
289

C:\>

Следующие шаги

Из третьей части в серии вы узнали о скачивании больших объемов данных из учетной записи хранения, в том числе о следующем:

  • Выполнение приложения
  • Проверка количества подключений.

Перейдите к четвертой части в серии, чтобы проверить показатели пропускной способности и задержки на портале.

Verify throughput and latency metrics for a storage account (Проверка показателей пропускной способности и задержки для учетной записи хранения)