Quickstart: .NET gebruiken om een Batch-pool te maken en een taak uit te voeren

In deze quickstart ziet u hoe u aan de slag gaat met Azure Batch door een C#-app uit te voeren die gebruikmaakt van de Azure Batch .NET API. De .NET-app:

  • Uploadt verschillende invoergegevensbestanden naar een Azure Storage-blobcontainer die moet worden gebruikt voor Batch-taakverwerking.
  • Hiermee maakt u een pool van twee virtuele machines (VM's) of rekenknooppunten waarop Windows Server wordt uitgevoerd.
  • Hiermee maakt u een taak waarmee taken op de knooppunten worden uitgevoerd om elk invoerbestand te verwerken met behulp van een Windows-opdrachtregel.
  • Geeft de uitvoerbestanden weer die door de taken worden geretourneerd.

Nadat u deze quickstart hebt voltooid, begrijpt u de belangrijkste concepten van de Batch-service en kunt u Batch gebruiken met realistischere, grotere workloads.

Vereisten

De app uitvoeren

Als u deze quickstart wilt voltooien, downloadt of kloont u de app, geeft u de accountwaarden op, bouwt en voert u de app uit en controleert u de uitvoer.

De app downloaden of klonen

Download of kloon de Azure Batch .NET-quickstart-app vanuit GitHub. Gebruik de volgende opdracht om de app-opslagplaats te klonen met een Git-client:

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

Geef uw accountgegevens op

De app moet de namen van uw Batch- en Opslagaccount, accountsleutelwaarden en het eindpunt van het Batch-account gebruiken. U kunt deze informatie ophalen uit Azure Portal, Azure-API's of opdrachtregelprogramma's.

Ga als volgende te werk om uw accountgegevens op te halen uit Azure Portal:

  1. Zoek en selecteer uw Batch-accountnaam in de Azure Search-balk.
  2. Selecteer sleutels in de linkernavigatiebalk op de pagina van uw Batch-account.
  3. Kopieer op de pagina Sleutels de volgende waarden:
  • Batch-account
  • Accounteindpunt
  • Primaire toegangssleutel
  • Naam van opslagaccount
  • Sleutel1

Navigeer naar de gedownloade map batch-dotnet-quickstart en bewerk de referentietekenreeksen in Program.cs om de waarden op te geven die u hebt gekopieerd:

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

Belangrijk

Het beschikbaar maken van accountsleutels in de app-bron wordt niet aanbevolen voor productiegebruik. U moet de toegang tot referenties beperken en ernaar verwijzen in uw code met behulp van variabelen of een configuratiebestand. Het is raadzaam om batch- en opslagaccountsleutels op te slaan in Azure Key Vault.

De app bouwen en uitvoeren en uitvoer weergeven

Als u de Batch-werkstroom in actie wilt zien, bouwt en voert u de toepassing uit in Visual Studio. U kunt ook de opdrachtregel dotnet build en dotnet run opdrachten gebruiken.

In Visual Studio:

  1. Open het bestand BatchDotNetQuickstart.sln , klik met de rechtermuisknop op de oplossing in Solution Explorer en selecteer Build. Als u hierom wordt gevraagd, gebruikt u NuGet Pakketbeheer om NuGet-pakketten bij te werken of te herstellen.

  2. Zodra de build is voltooid, selecteert u BatchDotNetQuickstart in de bovenste menubalk om de app uit te voeren.

De gebruikelijke uitvoeringstijd met de standaardconfiguratie is ongeveer vijf minuten. De eerste installatie van het poolknooppunt duurt het meest. Als u de taak opnieuw wilt uitvoeren, verwijdert u de taak uit de vorige uitvoering, maar verwijdert u de pool niet. Bij een vooraf geconfigureerde pool is de taak binnen een paar seconden voltooid.

De app retourneert uitvoer die vergelijkbaar is met het volgende voorbeeld:

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

Er is een pauze op Monitoring all tasks for 'Completed' state, timeout in 00:30:00... het moment dat de rekenknooppunten van de pool beginnen. Wanneer taken worden gemaakt, worden ze in Batch in de wachtrij geplaatst voor uitvoering in de pool. Zodra het eerste rekenknooppunt beschikbaar is, wordt de eerste taak uitgevoerd op het knooppunt. U kunt de status van knooppunten, taken en taken controleren vanaf de pagina van uw Batch-account in Azure Portal.

Nadat elke taak is voltooid, ziet u uitvoer die lijkt op het volgende voorbeeld:

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

De code bekijken

Bekijk de code om inzicht te hebben in de stappen in de Quickstart voor Azure Batch .NET.

Serviceclients maken en resourcebestanden uploaden

  1. Voor interactie met het opslagaccount gebruikt de app de Azure Storage Blobs-clientbibliotheek voor .NET om een BlobServiceClient te maken.

    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. De app gebruikt de blobServiceClient verwijzing om een container in het opslagaccount te maken en gegevensbestanden naar de container te uploaden. De bestanden in de opslag worden gedefinieerd als Batch ResourceFile-objecten die Batch later kan downloaden naar de rekenknooppunten.

    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. De app maakt een BatchClient-object voor het maken en beheren van Batch-pools, -taken en -taken. De Batch-client maakt gebruik van verificatie met gedeelde sleutels. Batch biedt ook ondersteuning voor Microsoft Entra-verificatie.

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

Een pool met rekenknooppunten maken

Voor het maken van een Batch-pool gebruikt de app de methode BatchClient.PoolOperations.CreatePool om het aantal knooppunten, de VM-grootte en de poolconfiguratie in te stellen. Het volgende VirtualMachineConfiguration-object specificeert een ImageReference naar een Windows Server Marketplace-installatiekopie. Batch ondersteunt een breed scala aan installatiekopieën van Windows Server- en Linux Marketplace-besturingssystemen en ondersteunt ook aangepaste VM-installatiekopieën.

De PoolNodeCount grootte van de vm en de vm PoolVMSize zijn gedefinieerde constanten. De app maakt een pool van twee Standard_A1_v2 knooppunten. Deze grootte biedt een goede balans tussen prestaties en kosten voor deze quickstart.

Met de Commit-methode wordt de pool naar de Batch-service verzonden.


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

Een Batch-job maken

Een Batch-taak is een logische groep met een of meer taken. De taak bevat instellingen die gebruikelijk zijn voor de taken, zoals prioriteit en de pool waarop taken moeten worden uitgevoerd.

De app gebruikt de BatchClient.JobOperations.CreateJob-methode om een Batch-taak te maken in de pool. Met de Commit-methode wordt de taak naar de Batch-service verzonden. De Batch-taak heeft in eerste instantie geen taken.

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

    job.Commit();
}
...

Taken maken

Batch biedt verschillende manieren om apps en scripts te implementeren op rekenknooppunten. Met deze app maakt u een lijst met CloudTask-invoerobjectenResourceFile. Elke taak verwerkt een invoerbestand met behulp van een eigenschap CommandLine . Op de Batch-opdrachtregel geeft u uw app of script op.

Met de opdrachtregel in de volgende code wordt de Windows-opdracht type uitgevoerd om de invoerbestanden weer te geven. Vervolgens voegt de app elke taak toe aan de taak met de methode AddTask , waarmee de taak in de wachtrij wordt geplaatst voor uitvoering op de rekenknooppunten.

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

Taakuitvoer weergeven

De app maakt een TaskStateMonitor om de taken te bewaken en ervoor te zorgen dat deze zijn voltooid. Wanneer elke taak wordt uitgevoerd, wordt de uitvoer naar stdout.txt geschreven. De app gebruikt vervolgens de eigenschap CloudTask.ComputeNodeInformation om het stdout.txt-bestand weer te geven voor elke voltooide taak.

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

Resources opschonen

De gemaakte opslagcontainer wordt automatisch verwijderd met de app en u krijgt de mogelijkheid de Batch-pool en -taak te verwijderen. Pools en knooppunten brengen kosten in rekening terwijl de knooppunten worden uitgevoerd, zelfs als ze geen taken uitvoeren. Als u de pool niet meer nodig hebt, verwijdert u deze.

Wanneer u uw Batch-account en opslagaccount niet meer nodig hebt, kunt u de resourcegroep verwijderen die deze bevat. Selecteer in Azure Portal de optie Resourcegroep verwijderen boven aan de pagina van de resourcegroep. Voer in het scherm Een resourcegroep verwijderen de naam van de resourcegroep in en selecteer vervolgens Verwijderen.

Volgende stappen

In deze quickstart hebt u een app uitgevoerd die gebruikmaakt van de Batch .NET-API om een Batch-pool, -knooppunten, -taak en -taken te maken. De taak heeft resourcebestanden geüpload naar een opslagcontainer, taken uitgevoerd op de knooppunten en uitvoer van de knooppunten weergegeven.

Nu u de belangrijkste concepten van de Batch-service begrijpt, bent u klaar om Batch te gebruiken met realistischere, grotere workloads. Als u meer wilt weten over Azure Batch en een parallelle workload wilt doorlopen met een echte toepassing, gaat u verder met de zelfstudie over Batch .NET.