Snabbstart: Använd .NET för att skapa en Batch-pool och köra ett jobb

Den här snabbstarten visar hur du kommer igång med Azure Batch genom att köra en C#-app som använder Azure Batch .NET API. .NET-appen:

  • Laddar upp flera indatafiler till en Azure Storage-blobcontainer som ska användas för bearbetning av Batch-uppgifter.
  • Skapar en pool med två virtuella datorer eller beräkningsnoder som kör Windows Server.
  • Skapar ett jobb som kör aktiviteter på noderna för att bearbeta varje indatafil med hjälp av en Windows-kommandorad.
  • Visar utdatafilerna som aktiviteterna returnerar.

När du har slutfört den här snabbstarten förstår du de viktigaste begreppen i Batch-tjänsten och är redo att använda Batch med mer realistiska arbetsbelastningar i större skala.

Förutsättningar

Kör appen

För att slutföra den här snabbstarten laddar du ned eller klonar appen, anger dina kontovärden, skapar och kör appen och verifierar utdata.

Ladda ned eller klona appen

Ladda ned eller klona Azure Batch .NET-snabbstartsappen från GitHub. Använd följande kommando för att klona app-lagringsplatsen med en Git-klient:

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

Ange kontoinformation

Appen måste använda dina Batch- och Storage-kontonamn, kontonyckelvärden och Batch-kontoslutpunkt. Du kan hämta den här informationen från Azure-portalen, Azure API:er eller kommandoradsverktyg.

Så här hämtar du kontoinformation från Azure-portalen:

  1. I Azure Search-fältet söker du efter och väljer ditt Batch-kontonamn.
  2. På sidan Batch-konto väljer du Nycklar i det vänstra navigeringsfältet.
  3. På sidan Nycklar kopierar du följande värden:
  • Batch-konto
  • Kontoslutpunkt
  • Primär åtkomstnyckel
  • Namn på lagringskonto
  • Key1

Gå till den nedladdade mappen batch-dotnet-quickstart och redigera autentiseringssträngarna i Program.cs för att ange de värden som du kopierade:

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

Viktigt!

Att exponera kontonycklar i appkällan rekommenderas inte för produktionsanvändning. Du bör begränsa åtkomsten till autentiseringsuppgifter och referera till dem i koden med hjälp av variabler eller en konfigurationsfil. Det är bäst att lagra Batch- och Storage-kontonycklar i Azure Key Vault.

Skapa och köra appen och visa utdata

Om du vill se batcharbetsflödet i praktiken skapar och kör du programmet i Visual Studio. Du kan också använda kommandoraden dotnet build och dotnet run kommandona.

I Visual Studio:

  1. Öppna filen BatchDotNetQuickstart.sln, högerklicka på lösningen i Solution Explorer och välj Skapa. Om du uppmanas att göra det använder du NuGet Package Manager för att uppdatera eller återställa NuGet-paket.

  2. När bygget är klart väljer du BatchDotNetQuickstart i den översta menyraden för att köra appen.

Normal körningstid med standardkonfigurationen är cirka fem minuter. Den första konfigurationen av poolnoden tar mest tid. Om du vill köra jobbet igen tar du bort jobbet från föregående körning, men tar inte bort poolen. På en förkonfigurerad pool slutförs jobbet inom några sekunder.

Appen returnerar utdata som liknar följande exempel:

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

Det sker en paus när Monitoring all tasks for 'Completed' state, timeout in 00:30:00... poolens beräkningsnoder startar. När uppgifter skapas köar Batch dem för att köras i poolen. Så snart den första beräkningsnoden är tillgänglig körs den första aktiviteten på noden. Du kan övervaka nod-, aktivitets- och jobbstatus från batchkontosidan i Azure-portalen.

När varje uppgift har slutförts visas utdata som liknar följande exempel:

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

Granska koden

Granska koden för att förstå stegen i Azure Batch .NET-snabbstarten.

Skapa tjänstklienter och ladda upp resursfiler

  1. För att interagera med lagringskontot använder appen Azure Storage Blobs-klientbiblioteket för .NET för att skapa en 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. Appen använder referensen blobServiceClient för att skapa en container i lagringskontot och ladda upp datafiler till containern. Filerna i lagringen definieras som Batch ResourceFile-objekt som Batch senare kan ladda ned till beräkningsnoderna.

    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. Appen skapar ett BatchClient-objekt för att skapa och hantera Batch-pooler, jobb och uppgifter. Batch-klienten använder autentisering med delad nyckel. Batch stöder även Microsoft Entra-autentisering.

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

Skapa en pool med beräkningsnoder

För att skapa en Batch-pool använder appen metoden BatchClient.PoolOperations.CreatePool för att ange antalet noder, VM-storlek och poolkonfiguration. Följande VirtualMachineConfiguration-objekt anger en ImageReference till en Windows Server Marketplace-avbildning. Batch stöder ett brett utbud av Windows Server- och Linux Marketplace OS-avbildningar och stöder även anpassade VM-avbildningar.

Storleken PoolNodeCount på den virtuella datorn PoolVMSize och är definierade konstanter. Appen skapar en pool med två Standard_A1_v2 noder. Den här storleken ger en bra balans mellan prestanda och kostnad för den här snabbstarten.

Metoden Commit skickar poolen till Batch-tjänsten.


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

Skapa ett Batch-jobb

Ett Batch-jobb är en logisk gruppering av en eller flera aktiviteter. Jobbet innehåller inställningar som är gemensamma för aktiviteterna, till exempel prioritet och poolen som aktiviteter ska köras på.

Appen använder metoden BatchClient.JobOperations.CreateJob för att skapa ett jobb på din pool. Metoden Commit skickar jobbet till Batch-tjänsten. Från början har jobbet inga aktiviteter.

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

    job.Commit();
}
...

Skapa uppgifter

Batch tillhandahåller flera sätt att distribuera appar och skript till beräkningsnoder. Den här appen skapar en lista över CloudTask-indataobjektResourceFile. Varje uppgift bearbetar en indatafil med hjälp av en CommandLine-egenskap . Kommandoraden Batch är den där du anger din app eller ditt skript.

Kommandoraden i följande kod kör Windows-kommandot type för att visa indatafilerna. Sedan lägger appen till varje aktivitet i jobbet med metoden AddTask , som köar uppgiften för att köras på beräkningsnoderna.

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

Visa aktivitetens utdata

Appen skapar en TaskStateMonitor för att övervaka aktiviteterna och se till att de slutförs. När varje aktivitet körs skrivs utdata till stdout.txt. Appen använder sedan egenskapen CloudTask.ComputeNodeInformation för att visa filen stdout.txt för varje slutförd uppgift.

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

Rensa resurser

Appen tar automatiskt bort den lagringscontainer den skapar och ger dig möjlighet att ta bort Batch-poolen och jobbet. Pooler och noder debiteras medan noderna körs, även om de inte kör jobb. Om du inte längre behöver poolen tar du bort den.

När du inte längre behöver ditt Batch-konto och lagringskonto kan du ta bort resursgruppen som innehåller dem. I Azure-portalen väljer du Ta bort resursgrupp överst på resursgruppssidan. På skärmen Ta bort en resursgrupp anger du resursgruppens namn och väljer sedan Ta bort.

Nästa steg

I den här snabbstarten körde du en app som använder Batch .NET API för att skapa en Batch-pool, noder, jobb och uppgifter. Jobbet laddade upp resursfiler till en lagringscontainer, körde uppgifter på noderna och visade utdata från noderna.

Nu när du förstår huvudbegreppen i Batch-tjänsten är du redo att använda Batch med mer realistiska arbetsbelastningar i större skala. Om du vill veta mer om Azure Batch och gå igenom en parallell arbetsbelastning med ett verkligt program fortsätter du till Självstudiekursen om Batch .NET.