Rendere persistenti i dati di attività e processi in Archiviazione di Azure con la libreria Batch File Conventions per .NET

Un'attività in esecuzione in Azure Batch può produrre dati di output quando viene eseguita. I dati di output delle attività spesso devono essere archiviati per consentirne il recupero da parte di altre attività del processo, dell'applicazione client che ha eseguito il processo o di entrambe. Le attività scrivono i dati di output nel file system di un nodo di calcolo di Batch, ma tutti i dati presenti nel nodo vanno persi quando ne viene ricreata l'immagine o quando il nodo lascia il pool. Le attività possono anche avere un periodo di memorizzazione dei file, dopo il quale i file creati dall'attività vengono eliminati. Per questi motivi, è importante salvare in modo permanente l'output delle attività che sarà necessario in seguito in un archivio dati, ad esempio Archiviazione di Azure.

Per le opzioni dell'account di archiviazione in Batch, vedere Account Batch e account di Archiviazione di Azure.

È possibile rendere persistenti i dati delle attività da Azure Batch usando la libreria File Conventions per .NET. La libreria Convenzioni file semplifica il processo di archiviazione e recupero dei dati di output delle attività in Archiviazione di Azure. È possibile usare la libreria File Conventions sia nel codice attività che nel codice client. In modalità attività usare la libreria per rendere persistenti i file. In modalità client usare la libreria per elencare e recuperare i file. Il codice attività può anche recuperare l'output delle attività upstream usando la libreria, ad esempio in uno scenario di dipendenze attività.

Per recuperare i file di output con la libreria File Conventions, individuare i file per un processo o un'attività. Non è necessario conoscere i nomi o i percorsi dei file. È invece possibile elencare i file in base all'ID e allo scopo. Ad esempio, elencare tutti i file intermedi per un'attività specifica. In alternativa, ottenere un file di anteprima per un determinato processo.

A partire dalla versione 2017-05-01, l'API del servizio Batch supporta il salvataggio permanente dei dati di output in Archiviazione di Azure per le attività e le attività di Gestione processi eseguite nei pool creati con la configurazione della macchina virtuale (VM). È possibile mantenere l'output dall'interno del codice che crea un'attività. Questo metodo è un'alternativa alla libreria File Conventions. È possibile modificare le applicazioni client del servizio Batch in modo che rendano persistente l'output senza dover aggiornare l'applicazione eseguita dall'attività. Per altre informazioni, vedere Rendere persistenti i dati di attività in Archiviazione di Azure con l'API del servizio Batch.

Casi d'uso della libreria

Azure Batch offre diversi modi per rendere persistente l'output delle attività. Usare la libreria File Conventions quando si vuole:

  • Modificare il codice per l'applicazione in esecuzione per rendere persistenti i file.
  • Trasmettere i dati ad Archiviazione di Azure mentre l'attività è ancora in esecuzione.
  • Rendere persistenti i dati dai pool.
  • Individuare e scaricare i file di output dell'attività in base all'ID o allo scopo nell'applicazione client o in altre attività.
  • Visualizzare l'output dell'attività nella portale di Azure.

Per altri scenari, è possibile considerare un approccio diverso. Per altre informazioni su altre opzioni, vedere Rendere persistenti l'output dei processi e delle attività in Archiviazione di Azure.

Che cos'è lo standard Batch File Conventions?

Lo standard Batch File Conventions fornisce uno schema di denominazione per i percorsi di contenitori e BLOB di destinazione in cui vengono scritti i file di output. I file persistenti nell'archiviazione di Azure che seguono lo standard sono visualizzabili automaticamente nella portale di Azure.

La libreria File Conventions per .NET denomina automaticamente i contenitori di archiviazione e i file di output delle attività in base allo standard. La libreria fornisce anche metodi per eseguire query sui file di output in Archiviazione di Azure. È possibile eseguire query in base all'ID processo, all'ID attività o allo scopo.

Se si sta sviluppando con un linguaggio diverso da .NET, è possibile implementare lo standard File Conventions nell'applicazione. Per altre informazioni, vedere Implementare lo standard Batch File Conventions.

Per rendere persistenti i dati di output in Archiviazione di Azure usando la libreria File Conventions, collegare prima un account di archiviazione di Azure all'account Batch.

  1. Accedere al portale di Azure.
  2. Cercare e selezionare Batch nella barra di ricerca.
  3. Selezionare l'account Batch da collegare ad Archiviazione di Azure.
  4. Nella pagina Account Batch selezionare Account di archiviazione in Impostazioni.
  5. Se non si dispone già di un account di archiviazione di Azure associato all'account Batch, selezionare Account di archiviazione (Nessuno).
  6. Selezionare l'account di archiviazione di Azure da usare. Per ottenere prestazioni ottimali, usare un account nella stessa area dell'account Batch.

Rendere persistenti i dati di output

È possibile rendere persistenti i dati di output del processo e dell'attività con la libreria File Conventions. Creare innanzitutto un contenitore in Archiviazione di Azure. Salvare quindi l'output nel contenitore. Usare la libreria client di Archiviazione di Azure per .NET nel codice dell'attività per caricare l'output dell'attività nel contenitore.

Per altre informazioni sull'uso di contenitori e BLOB in Archiviazione di Azure, vedere Introduzione all'archiviazione BLOB di Azure con .NET.

Tutti gli output di processi e attività resi persistenti con la libreria File Conventions vengono archiviati nello stesso contenitore. Se un numero elevato di attività tenta di rendere persistenti i file contemporaneamente, i limiti di limitazione dell'archiviazione di Azure potrebbero essere applicati. Per altre informazioni, vedere Elenco di controllo prestazioni e scalabilità per l'archiviazione BLOB.

Creare un contenitore di archiviazione

Per rendere persistente l'output delle attività in Archiviazione di Azure, creare innanzitutto un contenitore chiamando CloudJob.PrepareOutputStorageAsync. Questo metodo di estensione accetta un oggetto CloudStorageAccount come parametro. Il metodo crea un contenitore denominato secondo lo standard File Conventions. Il contenuto del contenitore è individuabile dai portale di Azure e dai metodi di recupero descritti in questo articolo.

In genere, creare un contenitore nell'applicazione client, che crea i pool, i processi e le attività. Ad esempio:

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

Archiviare gli output delle attività

Dopo aver creato il contenitore di archiviazione, le attività possono salvare l'output nel contenitore usando TaskOutputStorage. Questa classe è disponibile nella libreria File Conventions.

Nel codice dell'attività creare un oggetto TaskOutputStorage . Al termine del lavoro, chiamare TaskOutputStorage. Metodo SaveAsync . Questo passaggio salva l'output in Archiviazione di 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");

Il parametro kind del metodo TaskOutputStorage.SaveAsync consente di categorizzare i file persistenti. Esistono quattro tipi TaskOutputKind predefiniti: TaskOutput, TaskPreview, TaskLog e TaskIntermediate.. È anche possibile definire categorie personalizzate di output.

Specificare il tipo di output da elencare quando si esegue una query su Batch in un secondo momento. Quindi, quando si elencano gli output per un'attività, è possibile filtrare su uno dei tipi di output. Ad esempio, filtrare in "Assegnare l'output di anteprima per l'attività 109". Per altre informazioni, vedere Recuperare i dati di output.

Il tipo di output determina anche la posizione in cui viene visualizzato un file di output nella portale di Azure. I file nella categoria TaskOutput sono in File di output attività. I file nella categoria TaskLog sono inclusi nei log attività.

Archiviare gli output del processo

È anche possibile archiviare gli output associati a un intero processo. Ad esempio, nell'attività di unione di un processo di rendering del film, è possibile rendere permanente il filmato completamente sottoposto a rendering come output del processo. Al termine del processo, l'applicazione client può elencare e recuperare gli output per il processo. L'applicazione client non deve eseguire query sulle singole attività.

Archiviare l'output del processo chiamando JobOutputStorage. Metodo SaveAsync . Specificare JobOutputKind e nome file. Ad esempio:

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

Come per il tipo TaskOutputKind per gli output attività, usare il tipo JobOutputKind per classificare i file persistenti di un processo. In seguito, è possibile elencare un tipo specifico di output. Il tipo JobOutputKind include sia categorie di output che di anteprima. Il tipo supporta anche la creazione di categorie personalizzate.

Archiviare i log delle attività

Potrebbe anche essere necessario rendere persistenti i file aggiornati durante l'esecuzione di un'attività. Ad esempio, potrebbe essere necessario rendere persistenti i file di log o stdout.txt .stderr.txt La libreria File Conventions fornisce l'oggetto TaskOutputStorage. Metodo SaveTrackedAsync per rendere persistenti questi tipi di file. Tenere traccia degli aggiornamenti in un file nel nodo a un intervallo specificato con SaveTrackedAsync. Quindi, rendere persistenti gli aggiornamenti in Archiviazione di Azure.

L'esempio seguente usa SaveTrackedAsync per aggiornare stdout.txt in Archiviazione di Azure ogni 15 secondi durante l'esecuzione dell'attività:

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);
}

Sostituire la sezione Code to process data and produce output file(s) commentata con qualsiasi codice che l'attività esegue normalmente. Ad esempio, potrebbe essere disponibile codice che scarica i dati da Archiviazione di Azure, quindi esegue trasformazioni o calcoli. È possibile eseguire il wrapping di questo codice in un using blocco per aggiornare periodicamente un file con SaveTrackedAsync.

L'agente del nodo è un programma che viene eseguito in ogni nodo del pool. Questo programma fornisce l'interfaccia di comando e controllo tra il nodo e il servizio Batch. La Task.Delay chiamata è necessaria alla fine di questo using blocco. La chiamata assicura che l'agente del nodo abbia tempo per scaricare il contenuto dello standard nel file nel stdout.txt nodo. Senza questo ritardo, è possibile perdere gli ultimi secondi di output. Potrebbe non essere necessario questo ritardo per tutti i file.

Quando si abilita il rilevamento file con SaveTrackedAsync, solo le aggiunte al file rilevato vengono rese persistenti in Archiviazione di Azure. Usare questo metodo solo per tenere traccia dei file di log non ruotati o di altri file scritti in con operazioni di accodamento alla fine del file.

Recuperare i dati di output

Per recuperare i file di output per un'attività o un processo specifico, non è necessario conoscere il percorso in Archiviazione di Azure o nomi di file. In alternativa, è possibile richiedere i file di output in base all'ID dell'attività o del processo.

Il codice di esempio seguente esegue l'iterazione delle attività di un processo. Successivamente, il codice stampa alcune informazioni sui file di output per l'attività. Il codice scarica quindi i file da AzureStorage.

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

Visualizzare i file di output nel portale di Azure

Se i file di output dell'attività usano lo standard Batch File Conventions, è possibile visualizzare i file nel portale di Azure.

Per abilitare la visualizzazione dei file di output nel portale, è necessario soddisfare i requisiti seguenti:

Per visualizzare automaticamente i file di output nella portale di Azure, è necessario:

  1. Collegare un account di Archiviazione di Azure all'account Batch.
  2. Seguire le convenzioni di denominazione predefinite per i contenitori e i file di Archiviazione di Azure. Esaminare README per tutte le definizioni. Se si usa la libreria File Conventions per rendere permanente l'output, i file vengono mantenuti in base allo standard File Conventions.

Per visualizzare i file di output delle attività e i log nella portale di Azure:

  1. Accedere al portale di Azure.
  2. Passare all'attività per cui si vuole visualizzare l'output.
  3. Selezionare File di output salvati o Log salvati.

Esempio di codice

Il progetto di esempio PersistOutputs è uno degli esempi di codice di Azure Batch disponibili in GitHub. Questa soluzione di Visual Studio illustra come usare la libreria Azure Batch Convenzioni file per rendere persistente l'output dell'attività nell'archiviazione durevole. Per eseguire l'esempio, seguire questa procedura:

  1. Aprire il progetto in Visual Studio 2019.
  2. Aggiungere le credenziali dell'account batch e dell'account di archiviazione di Azure a AccountSettings.settings nel progetto Microsoft.Azure.Batch.Samples.Common .
  3. Compilare la soluzione. Non eseguire ancora la soluzione.
  4. Se richiesto, ripristinare eventuali pacchetti NuGet.
  5. Caricare un pacchetto dell'applicazione per PersistOutputsTask tramite il portale di Azure.
    1. Includere l'eseguibile e gli PersistOutputsTask.exe assembly dipendenti nel pacchetto .zip.
    2. Impostare l'ID applicazione su PersistOutputsTask.
    3. Impostare la versione del pacchetto dell'applicazione su 1.0.
  6. Selezionare Avvia per eseguire il progetto.
  7. Quando viene richiesto di selezionare la tecnologia di persistenza da usare, immettere 1. Questa opzione esegue l'esempio usando la libreria File Conventions per rendere persistente l'output dell'attività.

Ottenere la libreria Batch File Conventions per .NET

La libreria Batch File Conventions per .NET è disponibile in NuGet. La libreria estende le classi CloudJob e CloudTask con nuovi metodi. Per altre informazioni, vedere la documentazione di riferimento sulla libreria File Conventions.

Il codice sorgente della libreria File Conventions è disponibile in GitHub.

Passaggi successivi