Guia de início rápido: use o .NET para criar um pool de lotes e executar um trabalho

Este guia de início rápido mostra como começar a usar o Lote do Azure executando um aplicativo C# que usa a API .NET do Lote do Azure. O aplicativo .NET:

  • Carrega vários arquivos de dados de entrada em um contêiner de blob de Armazenamento do Azure para usar no processamento de tarefas em lote.
  • Cria um pool de duas máquinas virtuais (VMs), ou nós de computação, executando o Windows Server.
  • Cria um trabalho que executa tarefas nos nós para processar cada arquivo de entrada usando uma linha de comando do Windows.
  • Exibe os arquivos de saída que as tarefas retornam.

Depois de concluir este início rápido, você entende os principais conceitos do serviço Batch e está pronto para usar o Batch com cargas de trabalho mais realistas e de maior escala.

Pré-requisitos

Executar a aplicação

Para concluir este início rápido, baixe ou clone o aplicativo, forneça os valores da sua conta, crie e execute o aplicativo e verifique a saída.

Baixe ou clone o aplicativo

Baixe ou clone o aplicativo Azure Batch .NET Quickstart do GitHub. Use o seguinte comando para clonar o repositório de aplicativos com um cliente Git:

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

Forneça as informações da sua conta

O aplicativo precisa usar seus nomes de conta de Lote e Armazenamento, valores de chave de conta e ponto de extremidade de conta de Lote. Você pode obter essas informações do portal do Azure, APIs do Azure ou ferramentas de linha de comando.

Para obter as informações da sua conta a partir do portal do Azure:

  1. Na barra de Pesquisa do Azure, procure e selecione o nome da sua conta de lote.
  2. Na página Conta do lote, selecione Teclas na navegação à esquerda.
  3. Na página Chaves, copie os seguintes valores:
  • Conta em lote
  • Ponto final da conta
  • Chave de acesso primária
  • Nome da conta de armazenamento
  • Chave1

Navegue até a pasta batch-dotnet-quickstart baixada e edite as cadeias de caracteres de credenciais em Program.cs para fornecer os valores copiados:

// 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>

Importante

A exposição de chaves de conta na origem do aplicativo não é recomendada para uso em Produção. Você deve restringir o acesso às credenciais e consultá-las em seu código usando variáveis ou um arquivo de configuração. É melhor armazenar chaves de conta de Lote e Armazenamento no Cofre de Chaves do Azure.

Criar e executar o aplicativo e exibir a saída

Para ver o fluxo de trabalho em lote em ação, crie e execute o aplicativo no Visual Studio. Você também pode usar a linha dotnet build de comando e dotnet run os comandos.

No Visual Studio:

  1. Abra o arquivo BatchDotNetQuickstart.sln, clique com o botão direito do mouse na solução no Gerenciador de Soluções e selecione Compilar. Se solicitado, use o Gerenciador de Pacotes NuGet para atualizar ou restaurar pacotes NuGet.

  2. Quando a compilação for concluída, selecione BatchDotNetQuickstart na barra de menu superior para executar o aplicativo.

O tempo de execução típico com a configuração padrão é de aproximadamente cinco minutos. A configuração inicial do nó do pool leva mais tempo. Para executar novamente o trabalho, exclua-o da execução anterior, mas não exclua o pool. Num conjunto pré-configurado, o trabalho é concluído em alguns segundos.

O aplicativo retorna uma saída semelhante ao exemplo a seguir:

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...

Há uma pausa enquanto Monitoring all tasks for 'Completed' state, timeout in 00:30:00... os nós de computação do pool são iniciados. À medida que as tarefas são criadas, o Batch as enfileira para serem executadas no pool. Assim que o primeiro nó de computação estiver disponível, a primeira tarefa será executada no nó. Você pode monitorar o status do nó, da tarefa e do trabalho na página da sua conta em lote no portal do Azure.

Após a conclusão de cada tarefa, você verá uma saída semelhante ao exemplo a seguir:

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:
...

Rever o código

Revise o código para entender as etapas no Guia de início rápido do Azure Batch .NET.

Criar clientes de serviço e carregar arquivos de recursos

  1. Para interagir com a conta de armazenamento, o aplicativo usa a biblioteca de cliente de Blobs de Armazenamento do Azure para .NET para criar um 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. O aplicativo usa a blobServiceClient referência para criar um contêiner na conta de armazenamento e carregar arquivos de dados para o contêiner. Os arquivos em armazenamento são definidos como objetos Batch ResourceFile que Batch pode baixar posteriormente para os nós de computação.

    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. O aplicativo cria um objeto BatchClient para criar e gerenciar pools de lotes, trabalhos e tarefas. O cliente Batch usa autenticação de chave compartilhada. O Batch também suporta a autenticação Microsoft Entra.

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

Criar um conjunto de nós de computação

Para criar um pool de lotes, o aplicativo usa o método BatchClient.PoolOperations.CreatePool para definir o número de nós, o tamanho da VM e a configuração do pool. O seguinte objeto VirtualMachineConfiguration especifica um ImageReference para uma imagem do Windows Server Marketplace. O Batch suporta uma ampla gama de imagens do sistema operacional Windows Server e Linux Marketplace e também suporta imagens de VM personalizadas.

O tamanho PoolVMSize e VM PoolNodeCount são constantes definidas. O aplicativo cria um pool de dois nós Standard_A1_v2. Este tamanho oferece um bom equilíbrio entre desempenho e custo para este início rápido.

O método Commit submete o conjunto para o serviço Batch.


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

Criar uma tarefa do Batch

Uma tarefa do Batch é um agrupamento lógico para uma ou mais tarefas. O trabalho inclui configurações comuns às tarefas, como prioridade e o pool no qual executar tarefas.

A aplicação utiliza o método BatchClient.JobOperations.CreateJob para criar um trabalho no seu conjunto. O método Commit submete o trabalho para o serviço Batch. Inicialmente, os trabalhos não têm tarefas.

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

    job.Commit();
}
...

Criar tarefas

O Batch fornece várias maneiras de implantar aplicativos e scripts em nós de computação. Este aplicativo cria uma lista de objetos de entrada ResourceFile do CloudTask. Cada tarefa processa um arquivo de entrada usando uma propriedade CommandLine . A linha de comando Lote é onde você especifica seu aplicativo ou script.

A linha de comando no código a seguir executa o comando do Windows type para exibir os arquivos de entrada. Em seguida, o aplicativo adiciona cada tarefa ao trabalho com o método AddTask , que enfileira a tarefa para ser executada nos nós de computação.

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

Ver resultado das tarefas

O aplicativo cria um TaskStateMonitor para monitorar as tarefas e garantir que elas sejam concluídas. Quando cada tarefa é executada com êxito, sua saída grava no stdout.txt. Em seguida, o aplicativo usa a propriedade CloudTask.ComputeNodeInformation para exibir o arquivo stdout.txt para cada tarefa concluída.

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 (Limpar recursos)

A aplicação elimina automaticamente o contentor de armazenamento criado e oferece-lhe a opção de eliminar o conjunto e o trabalho do Batch. Pools e nós incorrem em cobranças enquanto os nós estão em execução, mesmo que não estejam executando trabalhos. Se você não precisar mais do pool, exclua-o.

Quando você não precisar mais de sua conta de lote e conta de armazenamento, poderá excluir o grupo de recursos que as contém. No portal do Azure, selecione Excluir grupo de recursos na parte superior da página do grupo de recursos. No ecrã Eliminar um grupo de recursos, introduza o nome do grupo de recursos e, em seguida, selecione Eliminar.

Próximos passos

Neste início rápido, você executou um aplicativo que usa a API .NET em lote para criar um pool de lotes, nós, trabalho e tarefas. O trabalho carregou arquivos de recursos em um contêiner de armazenamento, executou tarefas nos nós e exibiu a saída dos nós.

Agora que você entende os principais conceitos do serviço Batch, está pronto para usar o Batch com cargas de trabalho mais realistas e de maior escala. Para saber mais sobre o Azure Batch e percorrer uma carga de trabalho paralela com um aplicativo do mundo real, continue para o tutorial do Batch .NET.