Aufgaben zum Vorbereiten und Freigeben von Aufträgen auf Batch-Compute-Knoten

Für einen Azure Batch-Auftrag ist häufig ein Setup erforderlich, bevor die entsprechenden Aufgaben ausgeführt werden, sowie ein Wartungsschritt nach dem Auftrag, wenn die Aufgaben abgeschlossen sind. Sie müssen unter Umständen allgemeine Eingabedaten für die Tasks auf Ihre Serverknoten herunterladen oder Ausgabedaten der Tasks in Azure Storage hochladen, nachdem der Auftrag abgeschlossen wurde. Sie können Aufgaben zum Vorbereiten von Aufträgen und Freigeben von Aufträgen verwenden, um diese Vorgänge durchzuführen.

  • Bevor die Aufgaben eines Auftrags ausgeführt werden, wird die Aufgabe zum Vorbereiten von Aufträgen auf allen Compute-Knoten ausgeführt, für die die Ausführung von mindestens einer Aufgabe geplant ist.
  • Nach Abschluss des Auftrags wird die Aufgabe zum Freigeben von Aufträgen auf jedem Knoten im Pool ausgeführt, der eine Aufgabe zur Auftragsvorbereitung ausgeführt hat.

Wie bei anderen Batch-Aufgaben können Sie eine Befehlszeile angeben, die aufgerufen wird, wenn eine Aufgabe zum Vorbereiten oder Freigeben von Aufträgen ausgeführt wird. Aufgaben zum Vorbereiten und Freigeben von Aufträgen bieten vertraute Batch-Aufgaben-Features wie:

  • Herunterladen von Ressourcendateien.
  • Ausführung mit erhöhten Rechten.
  • Benutzerdefinierte Umgebungsvariablen.
  • Maximale Ausführungsdauer.
  • Anzahl von Wiederholungen.
  • Dateiaufbewahrungsdauer.

In diesem Artikel wird beschrieben, wie Sie die Klassen JobPreparationTask und JobReleaseTask in der Batch .NET-Bibliothek verwenden.

Tipp

Aufgaben zum Vorbereiten und Freigeben von Aufträgen sind insbesondere in Umgebungen mit einem gemeinsam genutzten Pool hilfreich, in denen ein Pool mit Compute-Knoten zwischen Auftragsausführungen beibehalten und von vielen verschiedenen Aufträgen genutzt wird.

Verwendungsmöglichkeiten für Aufgaben zum Vorbereiten und Freigeben von Aufträgen

Aufgaben zum Vorbereiten und Freigeben von Aufträgen eignen sich gut für die folgenden Szenarios:

  • Herunterladen von allgemeinen Aufgabendaten. Batch-Aufträge erfordern oft einen gemeinsamen Satz von Daten als Eingabe für die Aufgaben eines Auftrags. Sie können eine Aufgabe zum Vorbereiten von Aufträgen verwenden, um diese Daten vor der Ausführung anderer Aufgaben des Auftrags auf jeden Knoten herunterzuladen.

    Bei täglich durchgeführten Berechnungen zur Risikoanalyse sind Marktdaten z. B. auftragsspezifisch, gelten aber trotzdem für alle Aufgaben im Auftrag. Sie können eine Aufgabe zum Vorbereiten von Aufträgen verwenden, um diese Marktdaten, die oft mehrere Gigabyte groß sind, auf jeden Compute-Knoten herunterzuladen, sodass sie von jeder Aufgabe verwendet werden können, die auf dem Knoten ausgeführt wird.

  • Löschen der Auftrags- und Aufgabenausgabe. In einer Umgebung mit einem gemeinsam genutzten Pool, in der die Compute-Knoten eines Pools zwischen Aufträgen nicht außer Betrieb genommen werden, müssen Sie Auftragsdaten zwischen den Ausführungen unter Umständen löschen. Es kann beispielweise sein, dass Sie auf den Knoten Speicherplatz sparen oder die Sicherheitsrichtlinien Ihrer Organisation einhalten müssen. Verwenden Sie eine Aufgabe zum Freigeben von Aufträgen, um Daten zu löschen, die von einer Aufgabe zum Vorbereiten von Aufträgen heruntergeladen oder während der Aufgabenausführung generiert wurden.

  • Aufbewahren von Protokollen. Eventuell möchten Sie eine Kopie der von den Aufgaben generierten Protokolle oder die von fehlerhaften Anwendungen generierten Absturzabbilddateien aufbewahren. Sie können eine Aufgabe zum Freigeben von Aufträgen verwenden, um diese Daten zu komprimieren und in ein Azure Storage-Konto hochzuladen.

Auftragsvorbereitungsaufgabe

Vor der Ausführung der Aufgaben des Auftrags führt Batch die Aufgabe zum Vorbereiten von Aufträgen auf jedem Compute-Knoten aus, für den die Ausführung einer Aufgabe geplant ist. Standardmäßig wartet Batch, bis die Aufgabe zum Vorbereiten von Aufträgen abgeschlossen ist, bevor geplante Auftragsaufgaben ausgeführt werden. Sie können Batch jedoch so konfigurieren, dass nicht gewartet wird.

Nach dem Neustart des Knotens wird die Auftragsvorbereitungsaufgabe erneut ausgeführt, aber Sie können dieses Verhalten auch deaktivieren. Wenn Sie einen Auftrag mit einer Aufgabe zum Vorbereiten von Aufträgen und einer Auftrags-Manager-Aufgabe haben, wird die Aufgabe zum Vorbereiten von Aufträgen vor der Auftrags-Manager-Aufgabe und vor allen anderen Aufgaben ausgeführt. Die Auftragsvorbereitungsaufgabe wird immer zuerst ausgeführt.

Die Aufgabe zum Vorbereiten von Aufträgen wird nur auf Knoten ausgeführt, für die die Ausführung einer Aufgabe geplant ist. Dieses Verhalten verhindert unnötige Ausführungen auf Knoten, denen keine Aufgaben zugewiesen sind. Knoten werden möglicherweise keine Aufgaben zugewiesen, wenn die Anzahl der Aufgaben für einen Auftrag geringer ist, als die Anzahl der Knoten in einem Pool. Dieses Verhalten gilt auch, wenn die gleichzeitige Aufgabenausführung aktiviert ist. Einige Knoten bleiben inaktiv, wenn die Anzahl der Aufgaben geringer als die Gesamtzahl der möglichen zeitgleich ausgeführten Aufgaben ist.

Hinweis

JobPreparationTask unterscheidet sich vom CloudPool.StartTask insofern, dass JobPreparationTask beim Start jedes Auftrags ausgeführt wird, während StartTask nur ausgeführt wird, wenn ein Compute-Knoten einem Pool erstmals hinzugefügt oder neu gestartet wird.

Auftragsfreigabeaufgabe

Nachdem Sie einen Auftrag als abgeschlossen markiert haben, wird die Aufgabe zum Freigeben von Aufträgen auf jedem Knoten im Pool ausgeführt, der eine Aufgabe zur Auftragsvorbereitung ausgeführt hat. Um einen Auftrag als abgeschlossen zu markieren, geben Sie eine Terminate-Anforderung aus. Diese Anforderung legt anschließend den Status des Auftrags auf Wird beendet fest, beendet alle aktiven bzw. ausgeführten Tasks im Zusammenhang mit dem Auftrag und führt den Auftragsfreigabetask aus. Danach wird der Status des Auftrags in Abgeschlossen geändert.

Hinweis

Beim Löschen eines Auftrags wird der Auftragsfreigabetask ebenfalls ausgeführt. Wurde ein Auftrag jedoch bereits beendet, wird die Aufgabe zum Freigeben kein zweites Mal ausgeführt, wenn der Auftrag später gelöscht wird.

Aufgaben zum Freigeben von Aufträgen können maximal 15 Minuten lang ausgeführt werden, bevor sie vom Batch-Dienst beendet werden. Weitere Informationen finden Sie in der Referenzdokumentation zur REST-API.

Aufgaben zum Vorbereiten und Freigeben von Aufträgen mit Batch .NET

Zum Ausführen einer Aufgabe zum Vorbereiten von Aufträgen weisen Sie der Eigenschaft CloudJob.JobPreparationTask Ihres Auftrags ein JobPreparationTask-Objekt zu. Auf ähnliche Weise initialisieren Sie einen JobReleaseTask und weisen ihn dem CloudJob.JobReleaseTask Ihres Auftrags zu, um den Freigabetask des Auftrags zu verwenden.

In dem folgenden Code-Ausschnitt ist myBatchClient eine Instanz von BatchClient und myPool ein vorhandener Pool im Batch-Konto.

// Create the CloudJob for CloudPool "myPool"
CloudJob myJob =
    myBatchClient.JobOperations.CreateJob(
        "JobPrepReleaseSampleJob",
        new PoolInformation() { PoolId = "myPool" });

// Specify the command lines for the job preparation and release tasks
string jobPrepCmdLine =
    "cmd /c echo %AZ_BATCH_NODE_ID% > %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";
string jobReleaseCmdLine =
    "cmd /c del %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";

// Assign the job preparation task to the job
myJob.JobPreparationTask =
    new JobPreparationTask { CommandLine = jobPrepCmdLine };

// Assign the job release task to the job
myJob.JobReleaseTask =
    new JobReleaseTask { CommandLine = jobReleaseCmdLine };

await myJob.CommitAsync();

Die Aufgabe zum Freigeben von Aufträgen wird ausgeführt, wenn ein Auftrag beendet oder gelöscht wird. Sie beenden einen Auftrag mithilfe von JobOperations.TerminateJobAsync, und Sie löschen einen Auftrag mithilfe von JobOperations.DeleteJobAsync. Normalerweise beenden oder löschen Sie einen Auftrag, wenn dessen Aufgaben abgeschlossen sind oder wenn eine Zeitüberschreitung erreicht wird, die Sie festgelegt haben.

// Terminate the job to mark it as completed. Terminate initiates the
// job release task on any node that ran job tasks. Note that the
// job release task also runs when a job is deleted, so you don't
// have to call Terminate if you delete jobs after task completion.

await myBatchClient.JobOperations.TerminateJobAsync("JobPrepReleaseSampleJob");

Codebeispiel auf GitHub

Erstellen Sie das Beispielprojekt JobPrepRelease auf GitHub, und führen Sie es aus, um Aufgaben zum Vorbereiten und Freigeben von Aufträgen in Aktion zu erleben. Diese Konsolenanwendung führt die folgenden Aktionen aus:

  1. Sie erstellt einen Pool mit zwei Knoten.
  2. Sie erstellt einen Auftrag mit Auftragsvorbereitungs-, Auftragsfreigabe- und Standardaufgaben.
  3. Sie führt die Aufgabe zum Vorbereiten von Aufträgen aus, die zunächst die Knoten-ID in eine Textdatei im freigegebenen Verzeichnis des Knotens schreibt.
  4. Sie führt auf jedem Knoten eine Aufgabe aus, welche die Aufgaben-ID in dieselbe Textdatei schreibt.
  5. Nach dem Abschluss aller Aufgaben oder Erreichen der Zeitüberschreitung gibt sie den Inhalt der Textdatei jedes Knotens an die Konsole aus.
  6. Sie führt die Aufgabe zum Freigeben von Aufträgen aus, um die Datei aus dem Knoten zu löschen, wenn der Auftrag abgeschlossen ist.
  7. Sie gibt die Exitcodes der Aufgaben zum Vorbereiten und Freigeben von Aufträgen für jeden Knoten aus, auf dem sie ausgeführt wurden.
  8. Sie hält die Ausführung an, um auf die Löschbestätigung für den Auftrag und/oder den Pool zu warten.

Die Ausgabe der Beispielanwendung sieht in etwa wie das folgende Beispiel aus:

Attempting to create pool: JobPrepReleaseSamplePool
Created pool JobPrepReleaseSamplePool with 2 nodes
Checking for existing job JobPrepReleaseSampleJob...
Job JobPrepReleaseSampleJob not found, creating...
Submitting tasks and awaiting completion...
All tasks completed.

Contents of shared\job_prep_and_release.txt on tvm-2434664350_1-20160623t173951z:
-------------------------------------------
tvm-2434664350_1-20160623t173951z tasks:
  task001
  task004
  task005
  task006

Contents of shared\job_prep_and_release.txt on tvm-2434664350_2-20160623t173951z:
-------------------------------------------
tvm-2434664350_2-20160623t173951z tasks:
  task008
  task002
  task003
  task007

Waiting for job JobPrepReleaseSampleJob to reach state Completed
...

tvm-2434664350_1-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

tvm-2434664350_2-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

Delete job? [yes] no
yes
Delete pool? [yes] no
yes

Sample complete, hit ENTER to exit...

Hinweis

Die unterschiedlichen Erstellungs- und Startzeiten von Knoten in einem neuen Pool bedeuten, dass einige Knoten für Aufgaben schneller bereit sind als andere, sodass möglicherweise eine andere Ausgabe angezeigt wird. Aufgrund der schnellen Ausführung der Aufgaben werden unter Umständen alle Aufgaben des Auftrags von einem einzelnen Knoten des Pools ausgeführt. In diesem Fall sind die Aufgaben zum Vorbereiten und Freigeben von Aufträgen für den Knoten, der keine Aufgaben ausgeführt hat, nicht vorhanden.

Anzeigen von Aufgaben zum Vorbereiten und Freigeben von Aufträgen im Azure-Portal

Sie können das Azure-Portal verwenden, um die Eigenschaften und Aufgaben des Batch-Auftrags, einschließlich der Aufgaben zum Vorbereiten und Freigeben von Aufträgen, anzuzeigen. Wählen Sie zunächst auf der Seite „Batch-Konto“ im linken Navigationsbereich Aufträge und dann einen Auftrag aus. Wenn Sie die Beispielanwendung ausführen, navigieren Sie zur Auftragsseite, nachdem die Aufgaben abgeschlossen sind, aber bevor Sie den Auftrag und den Pool löschen.

Sie können den Auftragsfortschritt und -status überwachen, indem Sie die ungefähre Aufgabenanzahl auf der Seite Übersicht oder Aufgaben für die Aufträge erweitern.

Screenshot: Fortschritt der Auftragsaufgabe im Azure-Portal

Der folgende Screenshot zeigt die Seite JobPrepReleaseSampleJob an, nachdem die Beispielanwendung ausgeführt wurde. Dieser Auftrag hatte Aufgaben zum Vorbereiten und Freigeben, sodass Sie im linken Navigationsbereich Aufgaben zum Vorbereiten oder Aufgaben zum Freigeben auswählen können, um deren Eigenschaften anzuzeigen.

Screenshot: Eigenschaften der Aufgabe zum Freigeben von Aufträgen im Azure-Portal

Nächste Schritte