Краткое руководство. Выполнение пакетного задания Azure с помощью API для .NETQuickstart: Run your first Azure Batch job with the .NET API

Начните работу с пакетной службой Azure, запустив задание из приложения C#, которое создано на основе API пакетной службы Azure для .NET.Get started with Azure Batch by running a job from a C# application built on the Azure Batch .NET API. Приложение отправляет несколько файлов входных данных в службу хранилища Azure, а затем создает пул вычислительных узлов пакетной службы (виртуальных машин).The app uploads several input data files to Azure storage and then creates a pool of Batch compute nodes (virtual machines). Затем оно создает образец задания, которое запускает задачи для обработки каждого входного файла в пуле путем использования основных команд.Then, it creates a sample job that runs tasks to process each input file on the pool using a basic command.

Выполняя действия из этого краткого руководства, вы изучите основные понятия пакетной службы и сможете использовать ее с более реалистичными рабочими нагрузками в большем масштабе.After completing this quickstart, you will understand the key concepts of the Batch service and be ready to try Batch with more realistic workloads at larger scale.

Схема, демонстрирующая рабочий процесс в приложении пакетной службы Azure

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

Вход в AzureSign in to Azure

Войдите на портал Azure по адресу https://portal.azure.com.Sign in to the Azure portal at https://portal.azure.com.

Получение учетных данных учетной записиGet account credentials

В этом примере нужно предоставить учетные данные для доступа к учетной записи службы хранилища и пакетной службы.For this example, you need to provide credentials for your Batch and Storage accounts. Проще всего получить необходимые учетные данные на портале Azure.A straightforward way to get the necessary credentials is in the Azure portal. (Можно также получить эти учетные данные с помощью API-интерфейсов Azure или средств командной строки.)(You can also get these credentials using the Azure APIs or command-line tools.)

  1. Выберите Все службы > Учетные записи пакетной службы и щелкните имя учетной записи пакетной службы.Select All services > Batch accounts, and then select the name of your Batch account.

  2. Для просмотра учетных данных пакетной службы нажмите Ключи.To see the Batch credentials, select Keys. Скопируйте значения учетной записи пакетной службы, URL-адреса, и первичного ключа доступа в текстовый редактор.Copy the values of Batch account, URL, and Primary access key to a text editor.

  3. Чтобы просмотреть имя и ключи учетной записи хранения, выберите Учетная запись хранения.To see the Storage account name and keys, select Storage account. Скопируйте значения имени учетной записи службы хранилища и Key1 в текстовый редактор.Copy the values of Storage account name and Key1 to a text editor.

Скачивание примера приложенияDownload the sample

Скачайте или клонируйте пример приложения с GitHub.Download or clone the sample app from GitHub. Чтобы клонировать пример репозитория приложения с клиентом Git, выполните следующую команду:To clone the sample app repo with a Git client, use the following command:

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

Перейдите в каталог, в котором содержится файл решения Visual Studio BatchDotNetQuickstart.sln.Navigate to the directory that contains the Visual Studio solution file BatchDotNetQuickstart.sln.

Откройте файл решения в Visual Studio и замените строки учетных данных в Program.cs значениями, полученными для своих учетных записей.Open the solution file in Visual Studio, and update the credential strings in Program.cs with the values you obtained for your accounts. Пример:For example:

// Batch account credentials
private const string BatchAccountName = "mybatchaccount";
private const string BatchAccountKey  = "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==";
private const string BatchAccountUrl  = "https://mybatchaccount.mybatchregion.batch.azure.com";

// Storage account credentials
private const string StorageAccountName = "mystorageaccount";
private const string StorageAccountKey  = "xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ==";

Примечание

Для упрощения примера учетные данные пакетной службы и службы хранения указаны в виде текста.To simplify the example, the Batch and Storage account credentials appear in clear text. На практике мы рекомендуем ограничить доступ к учетным данным и ссылаться на них в коде, используя переменные среды или файл конфигурации.In practice, we recommend that you restrict access to the credentials and refer to them in your code using environment variables or a configuration file. См. репозиторий с примерами кода для пакетной службы Azure.For examples, see the Azure Batch code samples repo.

Создание и запуск приложенияBuild and run the app

Чтобы просмотреть на рабочий процесс пакетной службы в действии, создайте и запустите приложение в Visual Studio или с помощью команд dotnet build и dotnet run в командной строке.To see the Batch workflow in action, build and run the application in Visual Studio, or at the command line with the dotnet build and dotnet run commands. После запуска приложения просмотрите код, чтобы узнать, как работает каждый компонент приложения.After running the application, review the code to learn what each part of the application does. Visual Studio:For example, in Visual Studio:

  • Щелкните правой кнопкой мыши решение в обозревателе решений и выберите Build Solution (Сборка решения).Right-click the solution in Solution Explorer, and click Build Solution.

  • Подтвердите восстановление пакетов NuGet, если появится соответствующий запрос.Confirm the restoration of any NuGet packages, if you're prompted. Если вам необходимо скачать отсутствующие пакеты, установите диспетчер пакетов NuGet.If you need to download missing packages, ensure the NuGet Package Manager is installed.

Когда вы запустите пример приложения, консоль будет выглядеть так.When you run the sample application, the console output is similar to the following. Во время выполнения может возникнуть пауза на этапе Monitoring all tasks for 'Completed' state, timeout in 00:30:00..., когда будут запускаться вычислительные узлы пула.During execution, you experience a pause at Monitoring all tasks for 'Completed' state, timeout in 00:30:00... while the pool's compute nodes are started. Задачи помещаются в очередь для запуска после выполнения первого вычислительного узла.Tasks are queued to run as soon as the first compute node is running. Перейдите в учетную запись пакетной службы на портале Azure, чтобы отследить пул, вычислительные узлы, задания и задачи.Go to your Batch account in the Azure portal to monitor the pool, compute nodes, job, and tasks.

Sample start: 11/16/2018 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...

После завершения задач отобразятся выходные данные для каждой задачи, аналогичные приведенным ниже.After tasks complete, you see output similar to the following for each task:

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 in business, engineering, science, and other pursuits that require running lots of automated tasks....
stderr:
...

Обычное время выполнения — примерно 5 минут, если для приложения задана конфигурация по умолчанию.Typical execution time is approximately 5 minutes when you run the application in its default configuration. Настройка начального пула занимает больше всего времени.Initial pool setup takes the most time. Чтобы запустить задание повторно, удалите его из предыдущего запуска и не удаляйте пул.To run the job again, delete the job from the previous run and do not delete the pool. В предварительно настроенном пуле задание завершается через несколько секунд.On a preconfigured pool, the job completes in a few seconds.

Просмотр кодаReview the code

Приложение .NET в этом кратком руководстве выполняет следующие задачи.The .NET app in this quickstart does the following:

  • Отправляет три небольших текстовых файла в контейнер больших двоичных объектов в учетной записи хранения Azure.Uploads three small text files to a blob container in your Azure storage account. Эти файлы являются входными данными для обработки в пакетной службе.These files are inputs for processing by Batch.
  • Создает пул вычислительных узлов под управлением Windows Server.Creates a pool of compute nodes running Windows Server.
  • Создает задание, а также три задачи, выполняемые на узлах.Creates a job and three tasks to run on the nodes. Каждая задача обрабатывает один из входных файлов, используя командную строку Windows.Each task processes one of the input files using a Windows command line.
  • Отображает файлы, возвращаемые задачами.Displays files returned by the tasks.

Дополнительные сведения см. в следующих разделах и в файле Program.cs.See the file Program.cs and the following sections for details.

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

Чтобы взаимодействовать с учетной записью хранения, приложение использует клиентскую библиотеку службы хранилища Azure для .NET.To interact with a storage account, the app uses the Azure Storage Client Library for .NET. Оно создает ссылку на учетную запись, используя CloudStorageAccount, а затем из этой учетной записи — клиент CloudBlobClient.It creates a reference to the account with CloudStorageAccount, and from that creates a CloudBlobClient.

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

Приложение использует ссылку blobClient для создания контейнера в учетной записи хранения и передачи в него файлов данных.The app uses the blobClient reference to create a container in the storage account and to upload data files to the container. Файлы в хранилище определяются как объекты пакетной службы ResourceFile, которые она может впоследствии скачать на вычислительные узлы.The files in storage are defined as Batch ResourceFile objects that Batch can later download to compute nodes.

List<string> inputFilePaths = new List<string>
{
    "taskdata0.txt",
    "taskdata1.txt",
    "taskdata2.txt"
};

List<ResourceFile> inputFiles = new List<ResourceFile>();

foreach (string filePath in inputFilePaths)
{
    inputFiles.Add(UploadFileToContainer(blobClient, inputContainerName, filePath));
}

Приложение создает объект BatchClient для создания пулов, заданий и задач в пакетной службе, а также для управления ими.The app creates a BatchClient object to create and manage pools, jobs, and tasks in the Batch service. В примере клиент пакетной службы использует проверку подлинности с общим ключом.The Batch client in the sample uses shared key authentication. (Пакетная служба также поддерживает аутентификацию на основе Azure Active Directory.)(Batch also supports Azure Active Directory authentication.)

BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);

using (BatchClient batchClient = BatchClient.Open(cred))
...

Создание пула вычислительных узловCreate a pool of compute nodes

Для создания пула пакетной службы приложение использует метод BatchClient.PoolOperations.CreatePool, чтобы настроить количество узлов, размер виртуальной машины и конфигурацию пула.To create a Batch pool, the app uses the BatchClient.PoolOperations.CreatePool method to set the number of nodes, VM size, and a pool configuration. Объект VirtualMachineConfiguration указывает ImageReference в образе Windows Server, опубликованном в Azure Marketplace.Here, a VirtualMachineConfiguration object specifies an ImageReference to a Windows Server image published in the Azure Marketplace. Пакетная служба поддерживает широкий спектр образов Linux и Windows Server в Azure Marketplace, а также пользовательских образов виртуальной машины.Batch supports a wide range of Linux and Windows Server images in the Azure Marketplace, as well as custom VM images.

Количество узлов (PoolNodeCount) и размер виртуальной машины (PoolVMSize) являются определенными константами.The number of nodes (PoolNodeCount) and VM size (PoolVMSize) are defined constants. В образце по умолчанию создается пул с 2 узлами размера Standard_A1_v2.The sample by default creates a pool of 2 size Standard_A1_v2 nodes. Предлагаемый размер в этом кратком руководстве обеспечивает оптимальный баланс производительности и стоимости.The size suggested offers a good balance of performance versus cost for this quick example.

Метод фиксации отправляет пул в пакетную службу.The Commit method submits the pool to the Batch service.


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();
    }
...

Создание пакетного заданияCreate a Batch job

Пакетное задание — это логическая группа из одной или нескольких задач.A Batch job is a logical grouping of one or more tasks. Задание включает в себя параметры, общие для задач (например, приоритет и пул для запуска задач).A job includes settings common to the tasks, such as priority and the pool to run tasks on. Приложение использует метод BatchClient.JobOperations.CreateJob для создания задания в пуле.The app uses the BatchClient.JobOperations.CreateJob method to create a job on your pool.

Метод фиксации отправляет задание в пакетную службу.The Commit method submits the job to the Batch service. Изначально у задания нет задач.Initially the job has no tasks.

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

    job.Commit();
}
...

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

Приложение создает список объектов CloudTask.The app creates a list of CloudTask objects. Каждая задача обрабатывает входной объект ResourceFile, используя свойство CommandLine.Each task processes an input ResourceFile object using a CommandLine property. В этом примере командная строка запускает команду Windows type, чтобы отобразить входной файл.In the sample, the command line runs the Windows type command to display the input file. Эта команда является простым примером для демонстрационных целей.This command is a simple example for demonstration purposes. При использовании пакетной службы в командной строке задайте приложение или скрипт.When you use Batch, the command line is where you specify your app or script. В пакетной службе предусмотрен ряд способов для развертывания приложений и скриптов на вычислительных узлах.Batch provides a number of ways to deploy apps and scripts to compute nodes.

Затем приложение добавляет задачи к заданию с помощью метода AddTask, который ставит их в очередь для запуска на вычислительных узлах.Then, the app adds tasks to the job with the AddTask method, which queues them to run on the compute nodes.

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

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

batchClient.JobOperations.AddTask(JobId, tasks);

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

Приложение создает TaskStateMonitor для отслеживания задач, чтобы убедиться в их выполнении.The app creates a TaskStateMonitor to monitor the tasks to make sure they complete. Затем приложение использует свойство CloudTask.ComputeNodeInformation, чтобы отобразить файл stdout.txt, сформированный после завершения каждой задачи.Then, the app uses the CloudTask.ComputeNodeInformation property to display the stdout.txt file generated by each completed task. Если задача выполняется успешно, выходные данные команды задачи записываются в файл stdout.txt.When the task runs successfully, the output of the task command is written to 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());
}

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

Приложение автоматически удаляет созданный контейнер хранилища, а также предоставляет возможность удалить пул и задание пакетной службы.The app automatically deletes the storage container it creates, and gives you the option to delete the Batch pool and job. Но если во время работы узлов используется пул, плата взимается даже если задания не запланированы.You are charged for the pool while the nodes are running, even if no jobs are scheduled. Если вы больше не будете использовать пул, удалите его.When you no longer need the pool, delete it. При удалении пула удаляются все выходные данные задачи на узлах.When you delete the pool, all task output on the nodes is deleted.

Ставшие ненужными группу ресурсов, учетную запись пакетной службы и учетную запись хранения можно удалить.When no longer needed, delete the resource group, Batch account, and storage account. Для этого на портале Azure выберите группу ресурсов для учетной записи пакетной службы и щелкните Удалить группу ресурсов.To do so in the Azure portal, select the resource group for the Batch account and click Delete resource group.

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

В этом кратком руководстве вы запустили небольшое приложение, созданное с помощью API пакетной службы для .NET, для создания пула пакетной службы и пакетного задания.In this quickstart, you ran a small app built using the Batch .NET API to create a Batch pool and a Batch job. Это задание запустило образец задач и скачало выходные данные, созданные на одном узле.The job ran sample tasks, and downloaded output created on the nodes. Изучив основные понятия пакетной службы, вы сможете использовать ее с более реалистичными рабочими нагрузками в большем масштабе.Now that you understand the key concepts of the Batch service, you are ready to try Batch with more realistic workloads at larger scale. Дополнительные сведения о пакетной службе Azure и параллельной рабочей нагрузке с реальным приложением см. в следующем руководстве по пакетной службе для .NET.To learn more about Azure Batch, and walk through a parallel workload with a real-world application, continue to the Batch .NET tutorial.