Краткое руководство: использование .NET для создания пула Batch и выполнения задания

В этом кратком руководстве показано, как приступить к работе с пакетной службой Azure, запустив приложение C#, использующее API пакетной службы Azure. Приложение .NET:

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

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

Предпосылки

Запуск приложения

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

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

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

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

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

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

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

  1. На панели поиска Azure найдите и выберите имя учетной записи Batch.
  • Учетная запись пакетной обработки
  • Конечная точка учетной записи
  • Имя учетной записи хранения
  • ИД подписки
  • Имя группы ресурсов

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

// Batch account credentials
const string BatchAccountName = "<batch account>";
const string BatchAccountUrl  = "<account endpoint>";

// Azure Resource Manager credentials for the Batch account
const string SubscriptionId    = "<subscription ID>";
const string ResourceGroupName = "<resource group name>";

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

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

Чтобы просмотреть пакетный рабочий процесс в действии, создайте и запустите приложение в 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. Для взаимодействия с учетной записью хранения приложение использует клиентская библиотека BLOB-объектов службы хранилища Azure для .NET для создания BLOBServiceClient.

    string blobUri = "https://" + storageAccountName + ".blob.core.windows.net";
    
    var blobServiceClient = new BlobServiceClient(new Uri(blobUri), new DefaultAzureCredential());
    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 из библиотеки Azure.Compute.Batch для создания заданий и задач Batch и управления ими. Клиент Batch использует аутентификацию Microsoft Entra.

    BatchClient batchClient = new BatchClient(new Uri(BatchAccountUrl), new DefaultAzureCredential());
    ...
    
  4. Приложение также использует библиотеку Azure.ResourceManager.Batch для управления учетной записью Batch и ее пулами. Он создает ArmClient и получает ссылку BatchAccountResource для учетной записи пакетной службы с помощью идентификатора подписки, имени группы ресурсов и имени учетной записи пакетной службы.

    ArmClient armClient = new ArmClient(new DefaultAzureCredential());
    
    ResourceIdentifier batchAccountIdentifier = BatchAccountResource.CreateResourceIdentifier(
        SubscriptionId,
        ResourceGroupName,
        BatchAccountName);
    
    BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountIdentifier);
    

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

Чтобы создать пул Batch, приложение использует метод BatchAccountPoolCollection.CreateOrUpdateAsync, чтобы задать количество узлов, размер виртуальной машины и конфигурацию пула. Следующий объект BatchVmConfiguration задаёт объект BatchImageReference, ссылающийся на образ Windows Server из Marketplace. Пакетная служба поддерживает широкий спектр образов ОС Windows Server и Linux Marketplace, а также поддерживает пользовательские образы виртуальных машин.

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

BatchImageReference imageReference = new BatchImageReference()
{
    Publisher = "MicrosoftWindowsServer",
    Offer = "WindowsServer",
    Sku = "2016-datacenter-smalldisk",
    Version = "latest"
};

BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.windows amd64");

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = PoolVMSize,
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = PoolNodeCount }
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, PoolId, poolData);

Создание пакетного задания

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

Приложение использует BatchClient.CreateJobAsync для создания задания в вашем пуле. Изначально задание не имеет задач.

BatchJobCreateOptions job = new BatchJobCreateOptions(JobId, new BatchPoolInfo() { PoolId = PoolId });
await batchClient.CreateJobAsync(job);

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

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

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

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);

    BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId, taskCommandLine)
    {
        ResourceFiles = { inputFiles[i] }
    };
    tasks.Add(task);
}

await batchClient.CreateTasksAsync(JobId, tasks);

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

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

await foreach (BatchTask task in batchClient.GetTasksAsync(JobId))
{
    string nodeId = task.NodeInfo?.NodeId ?? "<unknown>";
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    BinaryData stdout = await batchClient.GetTaskFileAsync(JobId, task.Id, "stdout.txt");
    Console.WriteLine(stdout.ToString());
}

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

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

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

Дальнейшие действия

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

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