Краткое руководство. Создание пула пакетной службы и выполнение задания с помощью .NET

В этом кратком руководстве показано, как приступить к работе с пакетная служба Azure путем запуска приложения C#, использующего ПАКЕТНАЯ СЛУЖБА AZURE API .NET. Приложение .NET:

  • Отправляет несколько входных файлов данных в контейнер больших двоичных объектов служба хранилища Azure для обработки задач пакетной службы.
  • Создает пул двух виртуальных машин (виртуальных машин) или вычислительных узлов под управлением Windows Server.
  • Создает задание, которое выполняет задачи на узлах для обработки каждого входного файла с помощью командной строки Windows.
  • Отображает выходные файлы, возвращаемые задачами.

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

Необходимые компоненты

  • Учетная запись Azure с активной подпиской. Если у вас нет учетной записи, создайте бесплатную учетную запись.

  • Учетная запись пакетной службы с связанной служба хранилища Azure учетной записью. Учетные записи можно создать с помощью любого из следующих методов: Azure CLI | портал Azure | Bicep | ARM шаблона | Terraform.

  • Visual Studio 2019 или более поздней версии или .NET 6.0 или более поздней версии для Linux или Windows.

Выполнить приложение

Чтобы завершить работу с этим кратким руководством, вы скачайте или клонируйте приложение, укажите значения учетной записи, создайте и запустите приложение и проверьте выходные данные.

Скачивание или клонирование приложения

Скачайте или клонируйте приложение быстрого запуска .NET пакетная служба Azure из GitHub. Используйте следующую команду, чтобы клонировать репозиторий приложения с клиентом Git:

git clone https://github.com/Azure-Samples/batch-dotnet-quickstart.git

Укажите сведения о учетной записи

Приложение должно использовать имена учетных записей пакетной службы и служба хранилища, значения ключей учетной записи и конечную точку учетной записи пакетной службы. Эти сведения можно получить из средств портал Azure, API Azure или командной строки.

Чтобы получить сведения об учетной записи из портал Azure, выполните следующие действия.

  1. На панели поиска Azure найдите и выберите имя учетной записи пакетной службы.
  2. На странице учетной записи пакетной службы выберите "Ключи " в области навигации слева.
  3. На странице "Ключи" скопируйте следующие значения:
  • Учетная запись пакетной службы
  • Конечная точка учетной записи
  • Первичный ключ доступа
  • Имя учетной записи хранения
  • Key1

Перейдите к скачаной папке batch-dotnet-quickstart и измените строки учетных данных в Program.cs , чтобы указать скопированные значения:

// Batch account credentials
private const string BatchAccountName = "<batch account>";
private const string BatchAccountKey  = "<primary access key>";
private const string BatchAccountUrl  = "<account endpoint>";

// Storage account credentials
private const string StorageAccountName = "<storage account name>";
private const string StorageAccountKey  = "<key1>

Важно!

Предоставление ключей учетной записи в источнике приложения не рекомендуется для использования в рабочей среде. Необходимо ограничить доступ к учетным данным и ссылаться на них в коде с помощью переменных или файла конфигурации. Рекомендуется хранить ключи учетной записи пакетной службы и служба хранилища в Azure Key Vault.

Создание и запуск приложения и просмотр выходных данных

Чтобы просмотреть рабочий процесс пакетной службы в действии, создайте и запустите приложение в Visual Studio. Вы также можете использовать командную строку dotnet build и dotnet run команды.

В Visual Studio:

  1. Откройте файл BatchDotNetQuickstart.sln, щелкните правой кнопкой мыши решение в Обозреватель решений и выберите "Сборка". При появлении запроса используйте nuGet диспетчер пакетов для обновления или восстановления пакетов NuGet.

  2. После завершения сборки выберите BatchDotNetQuickstart в верхней строке меню, чтобы запустить приложение.

Обычное время выполнения с конфигурацией по умолчанию составляет примерно пять минут. Начальная настройка узла пула занимает больше всего времени. Чтобы повторно запустить задание, удалите задание из предыдущего запуска, но не удаляйте пул. В предварительно настроенном пуле задание завершается через несколько секунд.

Приложение возвращает выходные данные, аналогичные следующему примеру:

Sample start: 11/16/2022 4:02:54 PM

Container [input] created.
Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [DotNetQuickstartPool]...
Creating job [DotNetQuickstartJob]...
Adding 3 tasks to job [DotNetQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

При запуске вычислительных узлов пула возникает пауза Monitoring all tasks for 'Completed' state, timeout in 00:30:00... . По мере создания задач пакетная служба их выполняет в пуле. Как только первый вычислительный узел доступен, первая задача выполняется на узле. Вы можете отслеживать состояние узла, задачи и задания на странице учетной записи пакетной службы в портал Azure.

После завершения каждой задачи вы увидите выходные данные, аналогичные следующему примеру:

Printing task output.
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard out:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...
stderr:
...

Просмотр кода

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

Создание клиентов служб и отправка файлов ресурсов

  1. Чтобы взаимодействовать с учетной записью хранения, приложение использует клиентская библиотека служба хранилища Azure BLOB-объектов для .NET для создания BLOBServiceClient.

    var sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);
    string blobUri = "https://" + storageAccountName + ".blob.core.windows.net";
    
    var blobServiceClient = new BlobServiceClient(new Uri(blobUri), sharedKeyCredential);
    return blobServiceClient;
    
  2. Приложение использует ссылку blobServiceClient на создание контейнера в учетной записи хранения и отправку файлов данных в контейнер. Файлы в хранилище определяются как объекты Batch ResourceFile , которые пакетная служба может скачать на вычислительные узлы.

    List<string> inputFilePaths = new()
    {
        "taskdata0.txt",
        "taskdata1.txt",
        "taskdata2.txt"
    };
    
    var inputFiles = new List<ResourceFile>();
    
    foreach (var filePath in inputFilePaths)
    {
        inputFiles.Add(UploadFileToContainer(containerClient, inputContainerName, filePath));
    }
    
  3. Приложение создает объект BatchClient для создания пулов пакетной службы, заданий и задач и управления ими. Клиент пакетной службы использует проверку подлинности с общим ключом. Пакет также поддерживает проверку подлинности Microsoft Entra.

    var cred = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);
    
     using BatchClient batchClient = BatchClient.Open(cred);
    ...
    

Создание пула вычислительных узлов

Чтобы создать пул пакетной службы, приложение использует метод BatchClient.PoolOperations.CreatePool для задания количества узлов, размера виртуальной машины и конфигурации пула. Следующий объект VirtualMachineConfiguration указывает ImageReference для образа Windows Server Marketplace. Пакетная служба поддерживает широкий спектр образов ОС Windows Server и Linux Marketplace, а также поддерживает пользовательские образы виртуальных машин.

Размер PoolNodeCountPoolVMSize виртуальной машины определяется константами. Приложение создает пул двух Standard_A1_v2 узлов. Этот размер обеспечивает хороший баланс производительности и затрат для этого краткого руководства.

Метод фиксации отправляет пул в пакетную службу.


private static VirtualMachineConfiguration CreateVirtualMachineConfiguration(ImageReference imageReference)
{
    return new VirtualMachineConfiguration(
        imageReference: imageReference,
        nodeAgentSkuId: "batch.node.windows amd64");
}

private static ImageReference CreateImageReference()
{
    return new ImageReference(
        publisher: "MicrosoftWindowsServer",
        offer: "WindowsServer",
        sku: "2016-datacenter-smalldisk",
        version: "latest");
}

private static void CreateBatchPool(BatchClient batchClient, VirtualMachineConfiguration vmConfiguration)
{
    try
    {
        CloudPool pool = batchClient.PoolOperations.CreatePool(
            poolId: PoolId,
            targetDedicatedComputeNodes: PoolNodeCount,
            virtualMachineSize: PoolVMSize,
            virtualMachineConfiguration: vmConfiguration);

        pool.Commit();
    }
...

Создание задания пакетной службы

Пакетное задание — это логическая группа из одной или нескольких задач. Задание включает параметры, общие для задач, таких как приоритет и пул для выполнения задач.

Приложение использует метод BatchClient.JobOperations.CreateJob для создания задания в пуле. Метод фиксации отправляет задание в пакетную службу. Изначально у задания нет задач.

try
{
    CloudJob job = batchClient.JobOperations.CreateJob();
    job.Id = JobId;
    job.PoolInformation = new PoolInformation { PoolId = PoolId };

    job.Commit();
}
...

Создание задач

В пакетной службе предусмотрено несколько способов для развертывания приложений и скриптов на вычислительных узлах. Это приложение создает список входных ResourceFile объектов CloudTask. Каждая задача обрабатывает входной файл с помощью свойства CommandLine . В командной строке пакетной службы указывается приложение или скрипт.

Командная строка в следующем коде запускает команду Windows type для отображения входных файлов. Затем приложение добавляет каждую задачу в задание с помощью метода AddTask , который очереди задачи для выполнения на вычислительных узлах.

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);
    string inputFilename = inputFiles[i].FilePath;
    string taskCommandLine = String.Format("cmd /c type {0}", inputFilename);

    var task = new CloudTask(taskId, taskCommandLine)
    {
        ResourceFiles = new List<ResourceFile> { inputFiles[i] }
    };
    tasks.Add(task);
}

batchClient.JobOperations.AddTask(JobId, tasks);

Просмотр выходных данных задачи

Приложение создает TaskStateMonitor для мониторинга задач и убедитесь, что они завершены. При успешном выполнении каждой задачи выходные данные записываются в stdout.txt. Затем приложение использует свойство CloudTask.ComputeNodeInformation для отображения файла stdout.txt для каждой завершенной задачи.

foreach (CloudTask task in completedtasks)
{
    string nodeId = String.Format(task.ComputeNodeInformation.ComputeNodeId);
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    Console.WriteLine(task.GetNodeFile(Constants.StandardOutFileName).ReadAsString());
}

Очистка ресурсов

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

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

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

В этом кратком руководстве вы запустили приложение, использующее API пакетной службы .NET для создания пула пакетной службы, узлов, заданий и задач. Задание отправляет файлы ресурсов в контейнер хранилища, выполняет задачи на узлах и отображает выходные данные узлов.

Теперь, когда вы понимаете основные понятия пакетной службы, вы готовы использовать пакетную службу с более реалистичными, большими масштабируемыми рабочими нагрузками. Чтобы узнать больше о пакетная служба Azure и перейти к параллельной рабочей нагрузке с реальным приложением, перейдите к руководству по пакетной службе .NET.