Freigeben über


Schnellstart: Verwenden von .NET zum Erstellen eines Batchpools und Ausführen eines Auftrags

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

  • Lädt mehrere Eingabedatendateien in einen Azure Storage-BLOB-Container hoch, der für die Verarbeitung von Batchaufgaben verwendet werden soll.
  • Erstellt einen Pool von zwei virtuellen Computern (VMs) oder Computeknoten, auf denen Windows Server ausgeführt wird.
  • Erstellt einen Auftrag, der Aufgaben auf den Knoten ausführt, um jede Eingabedatei mithilfe einer Windows-Befehlszeile zu verarbeiten.
  • Zeigt die Ausgabedateien an, die die Aufgaben zurückgeben.

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

Voraussetzungen

App starten

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

Herunterladen oder Klonen der App

Laden Sie die Azure Batch .NET-Schnellstart-App 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

Geben Sie Ihre Kontoinformationen an

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

So rufen Sie Ihre Kontoinformationen aus dem 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
  • Name des Speicherkontos
  • Key1

Navigieren Sie zu Ihrem heruntergeladenen Batch-Dotnet-Schnellstartordner , und bearbeiten Sie die Anmeldeinformationszeichenfolgen in Program.cs , um die werte bereitzustellen, die Sie kopiert haben:

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

Um den Batchworkflow in Aktion anzuzeigen, erstellen Sie die Anwendung in Visual Studio, und führen Sie sie aus. Sie können auch die Befehlszeile dotnet build und dotnet run Befehle 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. Nachdem der Build abgeschlossen ist, wählen Sie "BatchDotNetQuickstart" in der oberen Menüleiste 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. Um den Auftrag erneut auszuführen, löschen Sie den Auftrag aus der vorherigen Ausführung, aber löschen Sie den Pool nicht. Bei einem vorkonfigurierten Pool wird der Auftrag in ein paar Sekunden abgeschlossen.

Die App gibt eine Ausgabe ähnlich 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 auf Der Seite "Batchkonto" im Azure-Portal überwachen.

Nach Abschluss jeder Aufgabe wird eine Ausgabe angezeigt, die dem folgenden Beispiel ähnlich ist.

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 in der Azure Batch .NET-Schnellstartanleitung zu verstehen.

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 einen Container im Speicherkonto zu erstellen und Datendateien in den Container hochzuladen. Die Dateien im Speicher werden als Batch ResourceFile-Objekte definiert, die Batch später auf die Computeknoten herunterladen kann.

    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 Batchpools, Aufträgen und Aufgaben. Der Batchclient verwendet die gemeinsame Schlüsselauthentifizierung. 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 Batchpools verwendet die App die BatchClient.PoolOperations.CreatePool-Methode , um die Anzahl von Knoten, VM-Größe und Poolkonfiguration festzulegen. Das folgende VirtualMachineConfiguration -Objekt gibt ein ImageReference für ein Windows Server Marketplace-Image an. Batch unterstützt eine vielzahl von Windows Server- und Linux Marketplace-Betriebssystemimages und unterstützt auch benutzerdefinierte VM-Images.

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

Die Commit-Methode sendet den Pool an den Batchdienst.


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 Batchauftrags

Ein Batchauftrag ist eine logische Gruppierung einer oder mehrerer Aufgaben. Die Aufgabe umfasst gängige Einstellungen für Aufgaben, wie Priorität und den Pool, auf dem die Aufgaben ausgeführt werden sollen.

Die App verwendet die BatchClient.JobOperations.CreateJob-Methode zum Erstellen eines Auftrags in Ihrem Pool. Die Commit-Methode sendet den Auftrag an den Batchdienst. Zunächst hat der Job keine Aufgaben.

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

    job.Commit();
}
...

Aufgaben erstellen

Batch bietet mehrere Möglichkeiten, Apps und Skripts auf Computeknoten zu deployen. Diese App erstellt eine Liste von CloudTask-EingabeobjektenResourceFile. Jede Aufgabe verarbeitet eine Eingabedatei mithilfe einer CommandLine-Eigenschaft . In der Befehlszeile "Batch" geben Sie Ihre App oder Ihr Skript an.

Die Befehlszeile im folgenden Code führt den Windows-Befehl type 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);

Aufgabenausgabe anzeigen

Die App erstellt einen TaskStateMonitor , um die Aufgaben zu überwachen und sicherzustellen, dass sie abgeschlossen sind. Wenn eine Aufgabe erfolgreich ausgeführt wird, schreibt ihre Ausgabe in stdout.txt. Die App verwendet dann 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

Die App löscht automatisch den erstellten Speichercontainer und bietet Ihnen die Möglichkeit, den Batchpool und den 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. Wenn Sie den Pool nicht mehr benötigen, löschen Sie ihn.

Wenn Sie Ihr Batchkonto und Speicherkonto nicht mehr benötigen, können Sie die Ressourcengruppe löschen, die sie enthält. Wählen Sie im Azure-Portal oben auf der Seite "Ressourcengruppe löschen " aus. Geben Sie auf dem Bildschirm " Ressourcengruppe löschen" den Namen der Ressourcengruppe ein, und wählen Sie dann "Löschen" aus.

Nächste Schritte

In dieser Schnellstartanleitung haben Sie eine App ausgeführt, die die Batch-.NET-API verwendet, um einen Batchpool, Knoten, Auftrag und Aufgaben zu erstellen. Der Auftrag lud Ressourcendateien in einen Speichercontainer hoch, führte Aufgaben auf den Knotenpunkten aus und zeigte die Ausgabe von diesen an.

Da Sie sich jetzt mit den wichtigsten Konzepten des Batch-Diensts vertraut gemacht haben, können Sie Batch mit realistischeren, umfangreicheren Workloads verwenden. Um mehr über Azure Batch zu erfahren und eine parallele Workload mit einer realen Anwendung zu durchlaufen, gehen Sie zum Batch .NET Tutorial über.