Поделиться через


Краткое руководство: использование .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.
  2. На странице учетной записи Batch выберите Ключи в области навигации слева.
  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>

Это важно

Экспонирование ключей учетной записи в исходном коде приложения не рекомендуется для использования в продуктивной среде. Необходимо ограничить доступ к учетным данным и ссылаться на них в коде с помощью переменных или файла конфигурации. Оптимальным вариантом является хранение ключей учетной записи Batch и Storage в 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 Batch .NET.

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

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

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

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


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 для создания задания в пуле. Метод Commit отправляет задание в пакетную службу. Изначально задание не имеет задач.

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

    job.Commit();
}
...

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

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

Командная строка в следующем коде запускает команду 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());
}

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

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

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

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

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

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