Conserver le résultat d’un travail et d’une tâche dans Azure Storage avec la bibliothèque File Conventions Batch pour .NET
Une tâche qui s’exécute dans Azure Batch peut produire des données de sortie pendant son exécution. Le plus souvent, les données de sortie des tâches doivent être stockées pour être récupérées par d’autres tâches du travail et/ou par l’application cliente qui a exécuté le travail. Les tâches écrivent les données de sortie dans le système de fichiers d’un nœud de calcul Batch, mais toutes les données du nœud sont perdues lorsque le nœud est réinitialisé ou qu’il quitte le pool. En outre, les tâches sont parfois associées à une période de rétention de fichier, au terme de laquelle les fichiers créés par la tâche sont supprimés. Pour toutes ces raisons, il est important de conserver la sortie des tâches dont vous aurez besoin par la suite dans un magasin de données tel que Stockage Azure.
Pour plus d’options de compte de stockage dans Batch, consultez Comptes de Stockage Azure et Batch.
Vous pouvez conserver les données de tâche à partir de Azure Batch à l’aide de la bibliothèque File Conventions pour .NET. La bibliothèque File Conventions simplifie les processus de stockage et de récupération des données de sortie de tâches dans Azure Storage. Vous pouvez utiliser la bibliothèque File Conventions dans le code de la tâche et du client. En mode tâche, utilisez la bibliothèque pour conserver les fichiers. En mode client, utilisez la bibliothèque pour répertorier et récupérer des fichiers. Le code de tâche peut également utiliser la bibliothèque pour récupérer la sortie des tâches en amont, comme dans un cas de dépendances de tâche.
Pour récupérer les fichiers de sortie avec la bibliothèque de conventions de fichiers, localisez les fichiers d’un travail ou d’une tâche. Vous n’avez pas besoin de connaître les noms ou les emplacements des fichiers. Au lieu de cela, vous pouvez répertorier les fichiers par ID et par objectif. Par exemple, répertorier tous les fichiers intermédiaires pour une tâche donnée. Ou obtenir un fichier d’aperçu pour un travail donné.
À partir de la version 2017-05-01, l’API du service Batch prend en charge la conservation des données de sortie vers Azure Storage pour les tâches, y compris celles du gestionnaire de travaux, qui s’exécutent sur des pools sous la configuration de la machine virtuelle. Vous pouvez conserver la sortie à partir du code qui crée une tâche. Cette méthode est une alternative à la bibliothèque File Conventions. Vous pouvez modifier les applications du client Batch pour conserver les sorties sans mettre à jour l’application que votre tâche exécute. Pour en savoir plus, consultez l’article Conserver les données de tâche dans Azure Storage avec l’API de service Batch.
Cas d’usage de la bibliothèque
Azure Batch offre plusieurs moyens de conserver la sortie des tâches. Utilisez la bibliothèque File Conventions lorsque vous souhaitez :
- Modifier le code de l’application que votre tâche exécute pour conserver les fichiers.
- Diffuser les données vers Azure Storage alors que la tâche est en cours d’exécution.
- Conserver des données des pools.
- Rechercher et télécharger des fichiers de sortie de tâches par ID ou par objectif dans votre application cliente ou d’autres tâches.
- Consulter les sorties de tâche dans le portail Azure.
Pour les autres scénarios, vous souhaiterez peut-être envisager une approche différente. Pour en savoir plus sur les autres options, consultez Conserver la sortie d’un travail et d’une tâche dans le stockage Azure.
Qu’est-ce qu’un standard de nommage des fichiers Batch dans File Conventions ?
Le standard de nommage des fichiers Batch dans File Conventions fournit un schéma d’affectation de noms pour les conteneurs de destination et chemins d’accès d’objets blob dans lesquels vos fichiers de sortie sont rédigés. Les fichiers conservés dans le stockage Azure qui suivent le standard sont automatiquement visualisables dans le portail Azure.
La bibliothèque File Conventions pour .NET nomme automatiquement vos conteneurs de stockage et les fichiers de sortie de tâche en respectant le standard de nommage. La bibliothèque fournit également des méthodes pour interroger les fichiers de sortie dans le stockage Azure. Vous pouvez interroger par ID de travail, ID de tâche ou objectif.
Si vous développez avec un autre langage que .NET, vous pouvez implémenter le standard de nommage de File Convention dans votre application. Pour en savoir plus, consultez l’article Implémenter le standard Batch File Conventions.
Lier un compte de stockage Azure
Pour conserver les données de sortie dans Azure Storage à l’aide de la bibliothèque File Conventions, liez d’abord un compte Azure Storage à votre compte Batch.
- Connectez-vous au portail Azure.
- Dans la barre de recherche, recherchez et sélectionnez Batch.
- Sélectionnez le compte Batch à lier avec le stockage Azure.
- Dans la page de compte Batch, sous Paramètres, sélectionnez Compte de stockage.
- Si vous n’avez pas déjà associé de compte de stockage Azure à votre compte Batch, sélectionnez sur Compte Storage (aucun).
- Sélectionnez le compte de stockage Azure à utiliser. Pour de meilleures performances, utilisez un compte dans la même région que le compte Batch.
Conserver les données de sortie
Vous pouvez conserver les données de sortie des travaux et des tâches avec la bibliothèque File Conventions. Commencez par créer un conteneur dans le stockage Azure. Ensuite, enregistrez la sortie dans le conteneur. Utilisez la bibliothèque du client Azure Storage pour .NET dans le code de tâche pour charger la sortie de tâche dans le conteneur.
Pour en savoir plus sur les conteneurs et les objets blob dans Azure Storage, consultez l’article Prise en main du stockage d’objets blob Azure à l’aide de .NET.
Toutes les sorties de travail et de tâche conservées avec la bibliothèque File Conventions sont stockées dans le même conteneur. Si de nombreuses tâches tentent de conserver des fichiers en même temps, des limitations de stockage Azure peuvent être appliquées. Pour plus d’informations, voir la Liste de contrôle des performances et de l’extensibilité pour le stockage Blob.
Créer un conteneur de stockage
Pour conserver les sorties de tâche dans Azure Storage, créez d’abord un conteneur avec la commande CloudJob.PrepareOutputStorageAsync. Cette méthode d’extension nécessite un objet CloudStorageAccount comme paramètre. La méthode crée un conteneur nommé conformément au standard File Conventions. Le contenu du conteneur est détectable par le portail Azure et les méthodes de récupération décrites dans cet article.
En règle générale, créez un conteneur dans votre application cliente, qui crée vos pools, travaux et tâches. Par exemple :
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);
Stocker les sorties des tâches
Après avoir créé votre conteneur de stockage, les tâches peuvent enregistrer la sortie dans le conteneur à l’aide de TaskOutputStorage. Cette classe est disponible dans la bibliothèque File Conventions.
Dans votre code de tâche, créez un objet TaskOutputStorage. Une fois que la tâche a terminé son travail, appelez la méthode TaskOutputStorage.SaveAsync. Cette étape enregistre la sortie dans le stockage Azure.
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");
Le paramètre kind
de la méthode TaskOutputStorage.SaveAsync permet d’organiser les fichiers conservés. Il existe quatre types prédéfinis TaskOutputKind : TaskOutput
, TaskPreview
, TaskLog
, et TaskIntermediate.
. Vous pouvez également définir des catégories de sortie personnalisées.
Spécifiez le type de sortie à répertorier lorsque vous interrogez le lot ultérieurement. Alors, lorsque vous répertoriez les sorties d’une tâche, vous pouvez filtrer la liste sur l’un des types de sortie. Par exemple, filtrez avec « Donnez-moi la sortie Aperçu pour la tâche 109 ». Pour plus d’informations, consultez Récupérer des données de sortie.
Le type de sortie détermine également où un fichier de sortie apparaît dans le portail Azure. Les fichiers de la catégorie TaskOutput se trouvent dans Fichiers de sortie des tâches. Les fichiers de la catégorie Tasklog se trouvent sous journaux des tâches.
Stocker les sorties des travaux
Vous pouvez également stocker les sorties associées à un travail entier. Par exemple, dans la tâche de fusion d’un travail de rendu de film, vous pouvez conserver le film intégralement rendu sous forme de sortie de travail. Une fois votre travail terminé, votre application cliente peut répertorier et récupérer les sorties du travail. Votre application cliente n’a pas besoin d’interroger les tâches individuelles.
Stockez la sortie du travail en appelant la méthode JobOutputStorage.SaveAsync. Spécifiez le JobOutputKind et le nom de fichier. Par exemple :
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");
Comme avec le type TaskOutputKind pour les sorties des tâches, vous pouvez utiliser le type JobOutputKind pour catégoriser les fichiers conservés d’un travail. Plus tard, vous pouvez répertorier un type spécifique de sortie. Le type JobOutputKind inclut les catégories de sortie et d’aperçu. Le type prend également en charge la création de catégories personnalisées.
Stocker les journaux d’activité de tâches
Vous devrez peut-être également conserver les fichiers qui sont mis à jour pendant l’exécution d’une tâche. Par exemple, vous devrez peut-être conserver les fichiers journaux, ou stdout.txt
et stderr.txt
. La bibliothèque File Conventions fournit la méthode TaskOutputStorage.SaveTrackedAsync pour faire persister ces types de fichiers. Suivre les mises à jour apportées à un fichier sur le nœud à un intervalle spécifié avec SaveTrackedAsync. Conservez ensuite ces mises à jour dans le stockage Azure.
L’exemple suivant utilise SaveTrackedAsync pour mettre à jour stdout.txt
dans le Stockage Azure toutes les 15 secondes pendant l’exécution de la tâche :
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);
}
Remplacez la section commentée Code to process data and produce output file(s)
par le code que votre tâche effectue normalement. Par exemple, vous pouvez insérer un code qui télécharge des données à partir d’Azure Storage et effectue sur celles-ci des transformations ou des calculs. Vous pouvez encapsuler ce code dans un bloc using
pour mettre régulièrement à jour un fichier avec SaveTrackedAsync.
L’agent node est un programme qui s’exécute sur chaque nœud du pool. Ce programme fournit l’interface de commande et de contrôle entre le nœud et le service batch. L'appel Task.Delay
est requis à la fin de ce bloc using
. L’appel permet de s’assurer que l’agent de nœud a le temps de vider le contenu standard du fichier stdout.txt
sur le nœud. Sans ce délai, il est possible de manquer les dernières secondes de la sortie. Vous n’avez peut-être pas besoin de ce délai pour tous les fichiers.
Lorsque vous activez le suivi des fichiers avec SaveTrackedAsync, seuls les ajouts apportés au fichier suivi sont conservés dans Azure Storage. Utilisez cette méthode uniquement pour le suivi des fichiers journaux sans rotation ou des autres fichiers qui sont rédigés avec des opérations d’ajout à la fin du fichier.
Récupérer les données de sortie
Pour récupérer les fichiers de sortie d’une tâche ou d’un travail spécifique, vous n’avez pas besoin de connaître le chemin d’accès dans le stockage Azure ou les noms de fichiers. À la place, vous pouvez effectuer des requêtes de fichiers de sortie par ID de tâche ou travail.
L’exemple de code suivant itère au sein des tâches d’un travail. Ensuite, le code imprime des informations sur les fichiers de sortie de la tâche. Ensuite, le code télécharge les fichiers à partir du stockage Azure.
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();
}
}
Afficher les fichiers de sortie dans le portail Azure
Si vos fichiers de sortie de tâches utilisent le standard File Conventions Batch, vous pouvez afficher les fichiers dans le portail Azure.
Pour activer l’affichage de vos fichiers de sortie dans le portail, vous devez respecter les exigences suivantes :
Pour que les fichiers de sortie s’affichent automatiquement dans le portail Azure, vous devez effectuer les opérations suivantes :
- Liez un compte de stockage Azure à votre compte Batch.
- Suivez les conventions d’affectation de noms prédéfinies pour les conteneurs et les fichiers du stockage Azure. Passez en revue le fichier LISEZMOI pour toutes les définitions. Si vous utilisez la bibliothèque File Conventions pour conserver vos sorties, vos fichiers sont conservés selon le standard de nommage de File Conventions.
Pour afficher les fichiers de sortie des tâches et les journaux dans le portail Azure :
- Connectez-vous au portail Azure.
- Accédez à la tâche dont vous souhaitez afficher la sortie.
- Sélectionnez Fichiers de sortie enregistrés ou Journaux enregistrés.
Exemple de code
L’exemple de projet PersistOutputs est l’un des exemples de code Azure Batch disponibles sur GitHub. Cette solution Visual Studio montre comment utiliser la bibliothèque Azure Batch File Conventions pour conserver une sortie de tâche dans l’espace de stockage durable. Pour exécuter l’exemple, procédez comme suit :
- Ouvrez le projet dans Visual Studio 2019.
- Ajoutez vos informations d’identification de compte Batch et de stockage Azure à AccountSettings.settings dans le projet Microsoft.Azure.Batch.Samples.Common.
- Générez la solution. N’exécutez pas encore la solution.
- Si vous y êtes invité, restaurez les packages NuGet.
- Utilisez le portail Azure pour charger un package d’application pour PersistOutputsTask.
- Incluez l'exécutable
PersistOutputsTask.exe
et ses assemblys dépendants dans le package .zip. - Configurez l’ID de l’application sur
PersistOutputsTask
. - Définissez la version du package d’application sur
1.0
.
- Incluez l'exécutable
- Sélectionnez Démarrer pour exécuter le projet.
- Lorsque vous êtes invité à sélectionner la technologie de persistance à utiliser, saisissez 1. Cette option exécute l’exemple à l’aide de la bibliothèque File Conventions pour conserver le résultat de la tâche.
Obtenir la bibliothèque Batch File Conventions pour .NET
La bibliothèque Batch File Conventions pour .NET est disponible sur NuGet. La bibliothèque développe les classes CloudJob et CloudTask avec de nouvelles méthodes. Pour plus d’informations, consultez la documentation de référence de bibliothèque File Conventions.
Le code source de la bibliothèque File Conventions est disponible sur GitHub.