Teilen über


Beibehalten von Auftrags- und Taskdateien in Azure Storage mit der Batch-Dateikonventionenbibliothek für .NET

Eine Aufgabe, die in Azure Batch ausgeführt wird, erzeugt möglicherweise Ausgabedaten, wenn sie ausgeführt wird. Aufgabenausgabedaten müssen häufig für den Abruf durch andere Aufgaben im Auftrag, die Clientanwendung, die den Auftrag ausgeführt hat, oder beides gespeichert werden. Aufgaben schreiben Ausgabedaten in das Dateisystem eines Batch-Computeknotens, doch alle Daten im Knoten gehen verloren, wenn ein Reimaging ausgeführt wird oder der Knoten den Pool verlässt. Aufgaben können auch einen Dateiaufbewahrungszeitraum haben, nach dem Dateien, die von der Aufgabe erstellt wurden, gelöscht werden. Aus diesen Gründen ist es wichtig, die Vorgangsausgabe beizubehalten, die Sie später in einem Datenspeicher wie Azure Storage benötigen.

Informationen zu Speicherkontooptionen im Batch finden Sie unter Batchkonten und Azure Storage-Konten.

Sie können Aufgabendaten aus Azure Batch mithilfe der Dateikonventionsbibliothek für .NET speichern. Die Bibliothek "Dateikonventionen" vereinfacht das Speichern und Abrufen von Aufgabenausgabedaten in Azure Storage. Sie können die Dateikonventionsbibliothek sowohl im Aufgaben- als auch im Clientcode verwenden. Verwenden Sie im Aufgabenmodus die Bibliothek, um Dateien beizubehalten. Verwenden Sie im Clientmodus die Bibliothek zum Auflisten und Abrufen von Dateien. Ihr Taskcode kann die Bibliothek auch zum Abrufen der Ausgaben von vorgelagerten Tasks verwenden, z. B. in einem Szenario mit Taskabhängigkeiten.

Um Ausgabedateien mit der Dateikonventionenbibliothek abzurufen, suchen Sie die Dateien für einen Auftrag oder Task. Sie müssen die Namen oder Speicherorte der Dateien nicht kennen. Stattdessen können Sie die Dateien nach ID und Zweck auflisten. Listen Sie beispielsweise alle Zwischendateien für eine bestimmte Aufgabe auf. Oder rufen Sie eine Vorschaudatei für einen bestimmten Auftrag ab.

Ab Version 2017-05-01 unterstützt die Batchdienst-API das Beibehalten von Ausgabedaten in Azure Storage für Aufgaben und Auftrags-Manager-Aufgaben, die auf Pools ausgeführt werden, die mit der Vm-Konfiguration (Virtual Machine) erstellt wurden. Sie können die Ausgabe innerhalb des Codes beibehalten, der eine Aufgabe erstellt. Diese Methode ist eine Alternative zur Dateikonventionsbibliothek. Sie können Ihre Batch-Client-Anwendungen so ändern, dass die Ausgabe gespeichert wird, ohne die Anwendung aktualisieren zu müssen, die Ihre Aufgabe ausführt. Weitere Informationen finden Sie unter Beibehalten von Taskdateien mithilfe der Batch-Dienst-API in Azure Storage.

Bibliotheksanwendungsfälle

Azure Batch bietet mehrere Möglichkeiten zum Beibehalten der Aufgabenausgabe. Verwenden Sie die Bibliothek "Dateikonventionen", wenn Sie Folgendes ausführen möchten:

  • Ändern Sie den Code für die Anwendung, die ihre Aufgabe ausführt, um Dateien beizubehalten.
  • Streamen sie Daten in Azure Storage, während die Aufgabe noch ausgeführt wird.
  • Beibehalten von Daten aus Pools.
  • Suchen und Herunterladen von Aufgabenausgabedateien nach ID oder Zweck in Ihrer Clientanwendung oder anderen Aufgaben.
  • Anzeigen der Aufgabenausgabe im Azure-Portal.

Für andere Szenarien sollten Sie möglicherweise einen anderen Ansatz in Betracht ziehen. Weitere Informationen zu anderen Optionen finden Sie unter "Auftrags- und Aufgabenausgabe beibehalten" in Azure Storage.

Was ist der Standard für Batchdateikonventionen?

Der Standard für Batchdateikonventionen stellt ein Benennungsschema für die Zielcontainer und Blobpfade bereit, in die Die Ausgabedateien geschrieben werden. Dateien, die im Azure-Speicher gespeichert sind, die dem Standard entsprechen, werden automatisch im Azure-Portal angezeigt.

Die Dateikonventionsbibliothek für .NET benennt Ihre Speichercontainer und Aufgabenausgabedateien automatisch gemäß dem Standard. Die Bibliothek stellt außerdem Methoden zum Abfragen von Ausgabedateien in Azure Storage bereit. Sie können nach Auftrags-ID, Aufgaben-ID oder Zweck abfragen.

Wenn Sie mit einer anderen Sprache als .NET entwickeln, können Sie den Dateikonventionsstandard selbst in Ihrer Anwendung implementieren. Weitere Informationen finden Sie unter Implementieren des Standards für Batchdateikonventionen.

Um Ausgabedaten mithilfe der Bibliothek "Dateikonventionen" in Azure Storage beizubehalten, verknüpfen Sie zuerst ein Azure Storage-Konto mit Ihrem Batchkonto.

  1. Melden Sie sich beim Azure-Portal an.
  2. Suchen Sie in der Suchleiste nach Batch , und wählen Sie sie aus.
  3. Wählen Sie das Batchkonto aus, das mit Azure Storage verknüpft werden soll.
  4. Wählen Sie auf der Seite "Batchkonto " unter "Einstellungen" die Option "Speicherkonto" aus.
  5. Wenn Sie noch nicht über ein Azure Storage-Konto verfügen, das Ihrem Batchkonto zugeordnet ist, wählen Sie "Speicherkonto (Keine)" aus.
  6. Wählen Sie das zu verwendende Azure Storage-Konto aus. Um eine optimale Leistung zu erzielen, verwenden Sie ein Konto in derselben Region wie das Batchkonto.

Beibehalten von Ausgabedaten

Sie können Auftrags- und Taskausgabedaten mit der Dateikonventionenbibliothek beibehalten. Erstellen Sie zunächst einen Container in Azure Storage. Speichern Sie dann die Ausgabe im Container. Verwenden Sie die Azure Storage-Clientbibliothek für .NET in Ihrem Aufgabencode, um die Aufgabenausgabe in den Container hochzuladen.

Weitere Informationen zum Arbeiten mit Containern und Blobs in Azure Storage finden Sie unter "Erste Schritte mit Azure Blob Storage mit .NET".

Alle Auftrags-und Taskausgaben, die mit der Bibliothek beibehalten werden, werden im gleichen Container gespeichert. Wenn eine große Anzahl von Tasks gleichzeitig versucht, Dateien zu speichern, werden ggf. die Drosselungslimits von Azure Storage erzwungen. Weitere Informationen finden Sie in der Prüfliste für Leistung und Skalierbarkeit für Blob Storage.

Erstellen eines Speichercontainers

Um die Aufgabenausgabe in Azure Storage beizubehalten, erstellen Sie zuerst einen Container, indem Sie CloudJob aufrufen. PrepareOutputStorageAsync. Diese Erweiterungsmethode verwendet ein CloudStorageAccount-Objekt als Parameter. Die Methode erstellt einen Container, der gemäß dem Standard für Dateikonventionen benannt ist. Der Inhalt des Containers kann vom Azure-Portal und den in diesem Artikel beschriebenen Abrufmethoden ermittelt werden.

Erstellen Sie in der Regel einen Container in Ihrer Clientanwendung, der Ihre Pools, Aufträge und Aufgaben erstellt. Beispiel:

CloudJob job = batchClient.JobOperations.CreateJob(
    "myJob",
    new PoolInformation { PoolId = "myPool" });

// Create reference to the linked Azure Storage account
CloudStorageAccount linkedStorageAccount =
    new CloudStorageAccount(myCredentials, true);

// Create the blob storage container for the outputs
await job.PrepareOutputStorageAsync(linkedStorageAccount);

Aufgabenausgaben speichern

Nachdem Sie Ihren Speichercontainer erstellt haben, können Aufgaben die Ausgabe mithilfe von TaskOutputStorage im Container speichern. Diese Klasse ist in der Dateikonventionsbibliothek verfügbar.

Erstellen Sie in Ihrem Aufgabencode ein TaskOutputStorage-Objekt . Nachdem die Aufgabe ihre Arbeit abgeschlossen hat, rufen Sie die Methode TaskOutputStorage.SaveAsync auf. In diesem Schritt wird die Ausgabe in Azure Storage gespeichert.

CloudStorageAccount linkedStorageAccount = new CloudStorageAccount(myCredentials);
string jobId = Environment.GetEnvironmentVariable("AZ_BATCH_JOB_ID");
string taskId = Environment.GetEnvironmentVariable("AZ_BATCH_TASK_ID");

TaskOutputStorage taskOutputStorage = new TaskOutputStorage(
    linkedStorageAccount, jobId, taskId);

/* Code to process data and produce output file(s) */

await taskOutputStorage.SaveAsync(TaskOutputKind.TaskOutput, "frame_full_res.jpg");
await taskOutputStorage.SaveAsync(TaskOutputKind.TaskPreview, "frame_low_res.jpg");

Der kind Parameter der TaskOutputStorage.Die SaveAsync-Methode kategorisiert die gespeicherten Dateien. Es gibt vier vordefinierte TaskOutputKind-Typen : TaskOutput, TaskPreview, TaskLog, und TaskIntermediate. Sie können auch benutzerdefinierte Kategorien der Ausgabe definieren.

Geben Sie an, welche Ausgabetypen beim Späteren Abfragen des Batches aufgeführt werden sollen. Wenn Sie dann die Ausgaben für eine Aufgabe auflisten, können Sie nach einem der Ausgabetypen filtern. Filtern Sie z. B. nach "Geben Sie mir die Vorschauausgabe für Vorgang 109". Weitere Informationen finden Sie unter Abrufen von Ausgabedaten.

Der Ausgabetyp bestimmt auch, wo eine Ausgabedatei im Azure-Portal angezeigt wird. Dateien in der Kategorie "TaskOutput " befinden sich unter "Aufgabenausgabedateien". Dateien in der Kategorie "TaskLog " befinden sich unter " Aufgabenprotokolle".

Speichern von Auftragsausgaben

Sie können auch die Ausgaben speichern, die einem gesamten Auftrag zugeordnet sind. Beispielsweise können Sie in der Zusammenführungsaufgabe eines Filmrenderingauftrags den vollständig gerenderten Film als Auftragsausgabe beibehalten. Wenn der Auftrag abgeschlossen ist, kann Ihre Kundenanwendung die Ausgaben für den Auftrag auflisten und abrufen. Ihre Clientanwendung muss die einzelnen Aufgaben nicht abfragen.

Speichern Sie die Ausgabe des Jobs, indem Sie die Methode JobOutputStorage.SaveAsync aufrufen. Geben Sie JobOutputKind und den Dateinamen an. Beispiel:

CloudJob job = new JobOutputStorage(acct, jobId);
JobOutputStorage jobOutputStorage = job.OutputStorage(linkedStorageAccount);

await jobOutputStorage.SaveAsync(JobOutputKind.JobOutput, "mymovie.mp4");
await jobOutputStorage.SaveAsync(JobOutputKind.JobPreview, "mymovie_preview.mp4");

Wie beim TaskOutputKind-Typ für Aufgabenausgaben verwenden Sie den JobOutputKind-Typ , um die gespeicherten Dateien eines Auftrags zu kategorisieren. Später können Sie einen bestimmten Ausgabetyp auflisten. Der JobOutputKind-Typ enthält sowohl Ausgabe- als auch Vorschaukategorien. Der Typ unterstützt auch das Erstellen benutzerdefinierter Kategorien.

Speichern von Aufgabenprotokollen

Möglicherweise müssen Sie auch Dateien beibehalten, die während der Ausführung einer Aufgabe aktualisiert werden. Beispielsweise müssen Sie möglicherweise Protokolldateien oder stdout.txt und stderr.txt beibehalten. Die Dateikonventionsbibliothek stellt die TaskOutputStorage bereit. SaveTrackedAsync-Methode zum Speichern dieser Arten von Dateien. Nachverfolgen von Aktualisierungen einer Datei auf dem Knoten in einem angegebenen Intervall mit SaveTrackedAsync. Speichern Sie diese Updates dann dauerhaft in Azure Storage.

Im folgenden Beispiel wird SaveTrackedAsync verwendet, um während der Ausführung der Aufgabe alle 15 Sekunden in Azure Storage zu aktualisieren stdout.txt :

TimeSpan stdoutFlushDelay = TimeSpan.FromSeconds(3);
string logFilePath = Path.Combine(
    Environment.GetEnvironmentVariable("AZ_BATCH_TASK_DIR"), "stdout.txt");

// The primary task logic is wrapped in a using statement that sends updates to
// the stdout.txt blob in Storage every 15 seconds while the task code runs.
using (ITrackedSaveOperation stdout =
        await taskStorage.SaveTrackedAsync(
        TaskOutputKind.TaskLog,
        logFilePath,
        "stdout.txt",
        TimeSpan.FromSeconds(15)))
{
    /* Code to process data and produce output file(s) */

    // We are tracking the disk file to save our standard output, but the
    // node agent may take up to 3 seconds to flush the stdout stream to
    // disk. So give the file a moment to catch up.
     await Task.Delay(stdoutFlushDelay);
}

Ersetzen Sie den kommentierten Abschnitt Code to process data and produce output file(s) durch den code, den Ihre Aufgabe normalerweise ausführt. Sie können z. B. Code haben, der Daten aus Azure Storage herunterlädt, und dann Transformationen oder Berechnungen durchführt. Sie können diesen Code in einen using Block einschließen, um eine Datei regelmäßig mit SaveTrackedAsync zu aktualisieren.

Der Knoten-Agent ist ein Programm, das auf jedem Knoten im Pool ausgeführt wird. Dieses Programm stellt die Befehls- und Steuerungsschnittstelle zwischen dem Knoten und dem Batchdienst bereit. Der Task.Delay Anruf ist am Ende dieses using Blocks erforderlich. Der Aufruf stellt sicher, dass der Knoten-Agent Zeit hat, die Standardinhalte in die stdout.txt-Datei auf dem Knoten zu leeren. Ohne diese Verzögerung ist es möglich, die letzten Sekunden der Ausgabe zu verpassen. Möglicherweise ist diese Verzögerung für alle Dateien nicht erforderlich.

Wenn Sie die Dateiverfolgung mit SaveTrackedAsync aktivieren, werden nur Anhänge an die nachverfolgte Datei in Azure Storage beibehalten. Verwenden Sie diese Methode nur zum Nachverfolgen nicht rotierender Protokolldateien oder anderer Dateien, die mit Anhängeoperationen am Ende der Datei geschrieben werden.

Abrufen von Ausgabedaten

Um Ausgabedateien für eine bestimmte Aufgabe oder einen bestimmten Auftrag abzurufen, müssen Sie den Pfad in Azure Storage oder Dateinamen nicht kennen. Stattdessen können Sie Ausgabedateien nach Aufgabe oder Auftrags-ID anfordern.

Der folgende Beispielcode durchläuft die Tasks eines Auftrags. Als Nächstes druckt der Code einige Informationen zu den Ausgabedateien für die Aufgabe. Anschließend lädt der Code die Dateien aus AzureStorage herunter.

foreach (CloudTask task in myJob.ListTasks())
{
    foreach (OutputFileReference output in
        task.OutputStorage(storageAccount).ListOutputs(
            TaskOutputKind.TaskOutput))
    {
        Console.WriteLine($"output file: {output.FilePath}");

        output.DownloadToFileAsync(
            $"{jobId}-{output.FilePath}",
            System.IO.FileMode.Create).Wait();
    }
}

Anzeigen von Ausgabedateien im Azure-Portal

Wenn Ihre Aufgabenausgabedateien den Standard für Batchdateikonventionen verwenden, können Sie die Dateien im Azure-Portal anzeigen.

Um die Anzeige Ihrer Ausgabedateien im Portal zu aktivieren, müssen Sie die folgenden Anforderungen erfüllen:

Damit Ausgabedateien automatisch im Azure-Portal angezeigt werden, müssen Sie:

  1. Verknüpfen Sie ein Azure Storage-Konto mit Ihrem Batchkonto.
  2. Befolgen Sie die vordefinierten Benennungskonventionen für Azure Storage-Container und -Dateien. Überprüfen Sie die INFODATEI für alle Definitionen. Wenn Sie die Dateikonventionsbibliothek verwenden, um die Ausgabe beizubehalten, werden Ihre Dateien gemäß dem Standard "Dateikonventionen" beibehalten.

So zeigen Sie Aufgabenausgabedateien und -protokolle im Azure-Portal an:

  1. Melden Sie sich beim Azure-Portal an.
  2. Wechseln Sie zu der Aufgabe, für die Sie die Ausgabe anzeigen möchten.
  3. Wählen Sie entweder gespeicherte Ausgabedateien oder gespeicherte Protokolle aus.

Codebeispiel

Das PersistOutputs-Beispielprojekt ist eines der Azure Batch-Codebeispiele auf GitHub. Diese Visual Studio-Projektmappe veranschaulicht, wie die Azure Batch-Dateikonventionenbibliothek verwendet werden kann, um die Taskausgabe in dauerhaftem Speicher beizubehalten. Führen Sie zum Ausführen des Beispiels die folgenden Schritte aus:

  1. Öffnen Sie das Projekt in Visual Studio 2019.
  2. Fügen Sie Ihre Anmeldeinformationen für Batch- und Azure Storage-Konten zu AccountSettings.settings im Microsoft.Azure.Batch.Samples.Common-Projekt hinzu.
  3. Erstellen Sie die Lösung. Führen Sie die Lösung noch nicht aus.
  4. Wenn Sie dazu aufgefordert werden, stellen Sie nuGet-Pakete wieder her.
  5. Laden Sie ein Anwendungspaket für PersistOutputsTask über das Azure-Portal hoch.
    1. Schließen Sie die ausführbare Datei „PersistOutputsTask.exe“ und ihre abhängigen Assemblys in das ZIP-Paket ein.
    2. Legen Sie die Anwendungs-ID auf PersistOutputsTask.
    3. Legen Sie die Anwendungspaketversion auf 1.0.
  6. Wählen Sie "Start" aus, um das Projekt auszuführen.
  7. Wenn Sie aufgefordert werden, die zu verwendende Persistenztechnologie auszuwählen, geben Sie "1" ein. Diese Option führt das Beispiel mithilfe der Dateikonventionenbibliothek aus, um die Taskausgabe dauerhaft zu speichern.

Holen Sie sich die Batch-Datei-Konventionen-Bibliothek für .NET

Die Batchdateikonventionsbibliothek für .NET ist in NuGet verfügbar. Die Bibliothek erweitert die Klassen CloudJob und CloudTask mit neuen Methoden. Weitere Informationen finden Sie in der Referenzdokumentation zur Dateikonventionsbibliothek.

Der Quellcode der Dateikonventionsbibliothek ist auf GitHub verfügbar.

Nächste Schritte