Schnellstart: Verwenden von .NET zum Erstellen eines Batch-Pools und Ausführen eines Auftrags

In dieser Schnellstartanleitung erfahren Sie, wie Sie in Azure Batch einsteigen, indem Sie eine C#-App ausführen, die die Azure Batch .NET-API verwendet. Die .NET-App:

  • Sie lädt mehrere Eingabedatendateien in einen Azure Storage-Blobcontainer hoch, der für die Batch-Aufgabenverarbeitung verwendet werden soll.
  • Sie erstellt einen Pool mit zwei VMs oder Serverknoten und führt Windows Server aus.
  • Erstellt einen Auftrag, der Aufgaben auf den Knoten ausführt, um jede Eingabedatei mithilfe einer Windows-Befehlszeile zu verarbeiten.
  • Sie zeigt die Ausgabedateien an, die von den Aufgaben zurückgegeben werden.

Nachdem Sie diese Schnellstartanleitung abgeschlossen haben, sind Sie mit den wichtigsten Konzepten des Batch-Diensts vertraut und verwenden Batch mit realistischeren, umfangreicheren Workloads.

Voraussetzungen

Ausführen der App

Um diese Schnellstartanleitung abzuschließen, laden Sie die App herunter, oder klonen Sie sie, geben Sie Ihre Kontowerte an, erstellen Sie die App und führen Sie sie aus, und überprüfen Sie die Ausgabe.

Herunterladen oder Klonen der App

Laden Sie die App für den Azure Batch .NET-Schnellstart von GitHub herunter, oder klonen Sie sie. Verwenden Sie den folgenden Befehl, um das App-Repository mit einem Git-Client zu klonen:

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

Bereitstellen Ihrer Kontoinformationen

Die App muss Ihre Batch- und Speicherkontonamen, Ihre Kontoschlüsselwerte und Ihren Batch-Kontoendpunkt verwenden. Sie können diese Informationen über das Azure-Portal, die Azure-APIs oder Befehlszeilentools abrufen.

So rufen Sie Ihre Kontoinformationen über das Azure-Portal ab

  1. Suchen Sie in der Azure Search-Leiste nach dem Namen Ihres Batch-Kontos, und wählen Sie ihn aus.
  2. Wählen Sie auf der Seite Ihres Batch-Kontos im linken Navigationsbereich die Option Schlüssel aus.
  3. Kopieren Sie auf der Seite Schlüssel die folgenden Werte:
  • Batch-Konto
  • Kontoendpunkt
  • Primärer Zugriffsschlüssel
  • Speicherkontoname
  • Key1

Navigieren Sie zu Ihrem heruntergeladenen Batch-dotnet-quickstart-Ordner, und bearbeiten Sie die Anmeldeinformationszeichenfolgen in Program.cs, um die kopierten Werte anzugeben:

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

Wichtig

Das Verfügbarmachen von Kontoschlüsseln in der App-Quelle wird für die Produktionsnutzung nicht empfohlen. Sie sollten den Zugriff auf Anmeldeinformationen einschränken und in Ihrem Code über Variablen oder eine Konfigurationsdatei darauf verweisen. Es empfiehlt sich, Batch- und Storage-Kontoschlüssel in Azure Key Vault zu speichern.

Erstellen und Ausführen der App und Anzeigen der Ausgabe

Erstellen Sie die Anwendung, und führen Sie sie in Visual Studio aus, um den Batch-Workflow in Aktion zu sehen. Sie können auch die Befehlszeilenbefehle dotnet build und dotnet run verwenden.

In Visual Studio:

  1. Öffnen Sie die Datei BatchDotNetQuickstart.sln, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Lösung, und wählen Sie Erstellen aus. Wenn Sie dazu aufgefordert werden, verwenden Sie den NuGet-Paket-Manager, um NuGet-Pakete zu aktualisieren oder wiederherzustellen.

  2. Wählen Sie nach Abschluss des Builds in der oberen Menüleiste batchDotNetQuickstart aus, um die App auszuführen.

Die typische Laufzeit mit der Standardkonfiguration beträgt ungefähr fünf Minuten. Am meisten Zeit nimmt die anfängliche Einrichtung der Poolknoten ein. Löschen Sie den Auftrag aus der vorherigen Ausführung, aber löschen Sie nicht den Pool, um den Auftrag erneut auszuführen. In einem vorkonfigurierten Pool wird der Auftrag innerhalb einiger Sekunden abgeschlossen.

Die App gibt eine Ausgabe wie im folgenden Beispiel zurück:

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

Es entsteht eine Pause bei Monitoring all tasks for 'Completed' state, timeout in 00:30:00..., während die Computeknoten des Pools starten. Wenn Aufgaben erstellt werden, reiht Batch sie in die Warteschlange ein, um sie im Pool auszuführen. Sobald der erste Computeknoten verfügbar ist, wird die erste Aufgabe auf dem Knoten ausgeführt. Sie können den Knoten-, Aufgaben- und Auftragsstatus über die Batch-Kontoseite im Azure-Portal überwachen.

Nach Abschluss der einzelnen Aufgaben wird eine Ausgabe ähnlich dem folgenden Beispiel angezeigt:

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

Überprüfen des Codes

Überprüfen Sie den Code, um die Schritte im Azure Batch .NET-Schnellstart nachzuvollziehen.

Erstellen von Dienstclients und Hochladen von Ressourcendateien

  1. Um mit dem Speicherkonto zu interagieren, verwendet die App die Azure Storage Blobs-Clientbibliothek für .NET, um einen BlobServiceClient zu erstellen.

    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. Die App verwendet den blobServiceClient-Verweis, um im Speicherkonto einen Container zu erstellen und Datendateien in den Container hochzuladen. Die Dateien im Speicher werden als Batch-ResourceFile-Objekte definiert, die von Batch später auf Serverknoten heruntergeladen werden können.

    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. Die App erstellt ein BatchClient-Objekt zum Erstellen und Verwalten von Batch-Pools, -Aufträgen und -Aufgaben. Für den Batch-Client wird die Authentifizierung mit gemeinsam verwendetem Schlüssel genutzt. Batch unterstützt auch die Microsoft Entra-Authentifizierung.

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

Erstellen eines Pools mit Computeknoten

Zum Erstellen eines Batch-Pools verwendet die App die BatchClient.PoolOperations.CreatePool-Methode, um die Anzahl von Knoten, die VM-Größe und eine Poolkonfiguration festzulegen. Das folgende VirtualMachineConfiguration-Objekt gibt einen ImageReference-Verweis auf ein Windows Server Marketplace Image an. Batch unterstützt viele verschiedene Linux Marketplace OS- und Windows Server-Images sowie benutzerdefinierte VM-Images.

Die PoolNodeCount und VM-Größe PoolVMSize sind definierte Konstanten. Die App erstellt einen Pool mit zwei Standard_A1_v2-Knoten. Diese Größe bietet für diesen Schnellstart ein gutes Preis-Leistungs-Verhältnis.

Mit der Commit-Methode wird der Pool an den Batch-Dienst übermittelt.


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

Erstellen eines Batch-Auftrags

Ein Batch-Auftrag ist eine logische Gruppierung für eine oder mehrere Aufgaben. Der Auftrag enthält gemeinsame Einstellungen für Aufgaben, z. B. die Priorität und den Pool zum Ausführen von Aufgaben.

Die App verwendet die BatchClient.JobOperations.CreateJob-Methode zum Erstellen eines Auftrags in Ihrem Pool. Mit der Commit-Methode wird der Auftrag an den Batch-Dienst übermittelt. Der Auftrag enthält ursprünglich keine Aufgaben.

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

    job.Commit();
}
...

Erstellen von Aufgaben

In Batch gibt es mehrere Möglichkeiten, Apps und Skripts auf Computeknoten bereitzustellen. Die App erstellt eine Liste mit CloudTask-Input-ResourceFileObjekten. Jede Aufgabe verarbeitet eine Eingabedatei mithilfe einer CommandLine-Eigenschaft. In der Batch-Befehlszeile geben Sie Ihre App oder Ihr Skript an.

Die Befehlszeile im folgenden Code führt den Windowstype-Befehl aus, um die Eingabedateien anzuzeigen. Anschließend fügt die App dem Auftrag mit der AddTask-Methode jede Aufgabe hinzu, mit der diese für die Ausführung auf den Serverknoten in die Warteschlange eingereiht werden.

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

Anzeigen der Aufgabenausgabe

Die App erstellt ein TaskStateMonitor, um die Aufgaben zu überwachen und sicherzustellen, dass sie abgeschlossen werden. Wenn eine Aufgabe erfolgreich ausgeführt wird, schreibt ihre Ausgabe in stdout.txt. Anschließend verwendet die App die CloudTask.ComputeNodeInformation-Eigenschaft, um die stdout.txt-Datei für jede abgeschlossene Aufgabe anzuzeigen.

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

Bereinigen von Ressourcen

Von der App wird der erstellte Speichercontainer automatisch gelöscht, und Sie erhalten die Möglichkeit, den Batch-Pool und -Auftrag zu löschen. Für Pools und Knoten fallen Gebühren an, während die Knoten ausgeführt werden, auch wenn sie keine Aufträge ausführen. Es ist ratsam, den Pool zu löschen, wenn Sie ihn nicht mehr benötigen.

Wenn Sie Ihr Batch-Konto und Speicherkonto nicht mehr benötigen, können Sie die Ressourcengruppe löschen, in der sie enthalten sind. Wählen Sie im Azure-Portal oben auf der Ressourcengruppenseite die Option Ressourcengruppe löschen aus. Geben Sie im Bildschirm Ressourcengruppe löschen den Ressourcengruppennamen ein, und wählen Sie dann Löschen aus.

Nächste Schritte

In dieser Schnellstartanleitung haben Sie eine App ausgeführt, die mithilfe der Batch .NET-API einen Batch-Pool, Knoten, einen Auftrag und Aufgaben erstellt. Der Auftrag hat Ressourcendateien in einen Speichercontainer hochgeladen, Aufgaben auf den Knoten ausgeführt und die Ausgabe der Knoten angezeigt.

Da Sie sich jetzt mit den wichtigsten Konzepten des Batch-Diensts vertraut gemacht haben, können Sie Batch mit realistischeren, umfangreicheren Workloads verwenden. Fahren Sie mit dem Batch .NET-Tutorial fort, um weitere Informationen zu Azure Batch und eine Führung durch einen parallelen Workload mit einer Anwendung aus der Praxis zu erhalten.

Tutorial: Run a parallel workload with Azure Batch using the .NET API (Tutorial: Ausführen einer parallelen Workload mit Azure Batch per .NET-API)