Partage via


Tâches de préparation et de fin de travail sur les nœuds de calcul Batch

Un travail Azure Batch nécessite souvent une configuration préalable à l’exécution de ses tâches, ainsi qu’une maintenance post-travail qui intervient après que les tâches ont abouti. Par exemple, vous pouvez être amené à télécharger les données d’entrée de tâches communes dans vos nœuds de calcul ou à charger les données de sortie de tâches dans le Stockage Azure une fois le travail terminé. Vous pouvez faire appel à des tâches de préparation de travail et de fin de travail pour mener à bien ces opérations.

  • L’exécution d’une tâche de préparation de travail intervient avant celle des tâches du travail, sur tous les nœuds de calcul destinés à exécuter au moins une tâche.
  • Lorsqu’un travail est terminé, une tâche de mise en production du travail s’exécute dans chaque nœud du pool qui a exécuté une tâche de préparation du travail.

Comme pour les autres tâches Batch, vous pouvez spécifier une ligne de commande à appeler pendant l’exécution d’une tâche de préparation ou de fin de travail. Les tâches de préparation et de fin de travail offrent des fonctionnalités de tâche Batch familières, telles que :

  • Téléchargement de fichiers de ressources.
  • Exécution avec élévation de privilèges.
  • Variables d’environnement personnalisées.
  • Durée d’exécution maximale.
  • Nombre de nouvelles tentatives.
  • Durée de rétention des fichiers.

Cet article montre comment utiliser les classes JobPreparationTask et JobReleaseTask de la bibliothèque Batch .NET.

Conseil

Les tâches de préparation et de fin de travail sont particulièrement utiles dans les environnements de pool partagé, où un pool de nœuds de calcul persiste entre les exécutions de travail et est utilisé par de nombreux travaux.

Cas d’usage des tâches de préparation et de fin de travail

Les tâches de préparation et de fin de travail sont parfaitement adaptées aux scénarios suivants :

  • Télécharger des données de tâche communes. Les travaux Batch réclament souvent un ensemble commun de données en guise d’entrée pour les tâches des travaux. Vous pouvez utiliser une tâche de préparation de travail pour télécharger ces données sur chaque nœud avant l’exécution des autres tâches du travail.

    Par exemple, dans les calculs d’analyse des risques quotidiens, les données de marché sont propres à un travail mais communes à toutes les tâches de ce travail. Vous pouvez utiliser une tâche de préparation de travail pour télécharger ces données de marché, qui représentent souvent plusieurs gigaoctets, sur chaque nœud de calcul pour permettre à toute tâche s’exécutant sur un nœud de les utiliser.

  • Supprimer la sortie de travail et de tâche. Dans un environnement de pool partagé, où les nœuds de calcul d’un pool ne sont pas désactivés entre les travaux, il peut être nécessaire de supprimer les données de travail entre les exécutions. Par exemple, vous pouvez avoir besoin de conserver de l’espace disque sur les nœuds ou de respecter les stratégies de sécurité de votre organisation. Vous pouvez utiliser une tâche de fin de travail pour supprimer les données qu’une tâche de préparation de travail a téléchargées ou que l’exécution de la tâche a générées.

  • Conserver les journaux. Vous pouvez souhaiter conserver une copie des fichiers journaux que vos tâches génèrent ou des fichiers image mémoire après incident que les applications en échec génèrent. Vous pouvez utiliser une tâche de fin de travail pour compresser ces données et les charger sur un compte Stockage Azure.

tâche de préparation du travail

Avant d’exécuter les tâches d’un travail, Batch exécute la tâche de préparation de travail sur chaque nœud de calcul destiné à exécuter une tâche. Par défaut, Batch attend que la tâche de préparation de travail aboutisse avant d’exécuter les tâches de travail planifiées, mais vous pouvez le configurer pour qu’il n’attende pas.

Si le nœud redémarre, la tâche de préparation du travail s’exécute de nouveau. Toutefois, vous pouvez également désactiver ce comportement. Si vous avez un travail qui comporte une tâche de préparation de travail et une tâche du gestionnaire de travaux, la tâche de préparation de travail s’exécute avant la tâche du gestionnaire de travaux ainsi que toutes les autres tâches. La tâche de préparation du travail est toujours exécutée en premier.

La tâche de préparation de travail s’exécute uniquement sur les nœuds destinés à exécuter une tâche. Ce comportement empêche les exécutions inutiles sur des nœuds auxquels aucune tâche n’est affectée. Il arrive qu’aucune tâche ne soit affectée à des nœuds quand le nombre de tâches de travail est inférieur au nombre de nœuds dans le pool. Ce comportement s’applique également quand l’exécution de tâches simultanées est activée. Dans ce cas, certains nœuds restent inactifs si le nombre de tâches est inférieur au nombre total de tâches simultanées possibles.

Notes

JobPreparationTask diffère de CloudPool.StartTask dans la mesure où JobPreparationTask s’exécute au début de chaque travail, tandis que StartTasks’exécute uniquement quand un nœud de calcul rejoint un pool ou redémarre.

tâche de validation du travail

Une fois que vous marquez un travail comme étant terminé, la tâche de fin de travail s’exécute sur chaque nœud du pool ayant exécuté une tâche de préparation du travail. Vous marquez un travail comme terminé en émettant une requête de fin. Cette requête définit ensuite l’état du travail sur arrêt, met fin à toutes les tâches actives ou en cours d’exécution associées au travail, puis exécute la tâche de validation du travail. Le travail passe ensuite à l'état terminé .

Notes

La suppression d’un travail exécute également la tâche de validation du travail. Cependant, si un travail est déjà terminé, la tâche de fin ne s’exécute pas une deuxième fois si ce travail est supprimé par la suite.

Les tâches de fin de travail peuvent s’exécuter pendant un maximum de 15 minutes. Au-delà, le service Batch y met fin. Pour plus d’informations, voir la Documentation de référence sur l’API REST.

Tâches de préparation et de fin de travail avec Batch .NET

Pour exécuter une tâche de préparation de travail, attribuez un objet JobPreparationTask à la propriété CloudJob.JobPreparationTask de votre travail. De même, pour utiliser une tâche de validation du travail, initialisez la propriété JobReleaseTask et affectez-la à la propriété CloudJob.JobReleaseTask de votre travail.

Dans l’extrait de code suivant, myBatchClient est une instance de BatchClient, et myPool est un pool existant dans le compte Batch.

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

La tâche de fin de travail s’exécute dès qu’un travail prend fin ou est supprimé. Pour mettre fin à un travail, utilisez JobOperations.TerminateJobAsync ; pour supprimer un travail, utilisez JobOperations.DeleteJobAsync. En règle générale, vous mettez fin ou supprimez un travail dès que ses tâches ont abouti ou qu’un délai d’expiration que vous avez défini a été atteint.

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

Exemple de code sur GitHub

Pour observer des tâches de préparation et de fin de travail en action, créez et exécutez l’exemple de projet JobPrepRelease sur GitHub. Cette application console effectue les actions suivantes :

  1. Crée un pool avec deux nœuds.
  2. Crée un travail avec des tâches de préparation du travail, de validation et standard.
  3. Exécute la tâche de préparation de travail, qui écrit d’abord l’ID de nœud dans un fichier texte dans le répertoire partagé d’un nœud.
  4. Exécute une tâche sur chaque nœud qui écrit son ID de tâche dans le même fichier texte.
  5. Une fois que toutes les tâches ont abouti ou que le délai d’attente a été atteint, imprime le contenu du fichier texte de chaque nœud dans la console.
  6. Exécute la tâche de fin de travail pour supprimer le fichier du nœud une fois que le travail a abouti.
  7. Imprime les codes de sortie des tâches de préparation et de fin de travail pour chaque nœud sur lequel elles sont exécutées.
  8. Interrompt l'exécution pour permettre la confirmation de la suppression du pool et/ou du travail.

La sortie de l’exemple d’application ressemble à l’exemple suivant :

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

Notes

Les heures de création et de démarrage des nœuds d’un nouveau pool étant variables, certains nœuds sont prêts pour les tâches avant les autres, et vous pouvez obtenir une sortie différente. Concrètement, comme les tâches se terminent rapidement, il peut arriver que l’un des nœuds du pool exécute toutes les tâches du travail. Si cela se produit, les tâches de préparation et de fin de travail n’existent pas pour un nœud qui n’a pas exécuté de tâches.

Consulter les tâches de préparation et de fin de travail sur le portail Azure

Vous pouvez utiliser le portail Azure pour consulter les propriétés et les tâches d’un travail Batch, notamment les tâches de préparation et de fin de travail. Depuis la page de votre compte Batch, sélectionnez Travaux dans le volet de navigation gauche, puis sélectionnez un travail. Si vous exécutez l’exemple d’application, accédez à la page du travail après que les tâches ont abouti, mais avant d’avoir supprimé le travail et le pool.

Vous pouvez surveiller la progression et l’état du travail en développant Nombre de tâches approximatif dans la page Vue d’ensemble ou Tâches du travail.

Capture d’écran montrant la progression des tâches du travail sur le portail Azure.

La capture d’écran suivante montre la page JobPrepReleaseSampleJob après l’exécution de l’exemple d’application. Sachant que ce travail comportait des tâches de préparation et de fin, vous pouvez sélectionner Tâches de préparation ou Tâches de fin dans le volet de navigation gauche pour consulter leurs propriétés.

Capture d’écran montrant les propriétés des tâches de fin de travail sur le portail Azure.

Étapes suivantes