Compartir a través de


Guardar datos de trabajos y tareas en Azure Storage con la biblioteca de convenciones de archivo para .NET

Una tarea que se ejecuta en Azure Batch puede generar datos de salida cuando se ejecuta. Los datos de salida de tareas se suelen almacenar para su recuperación por parte de otras tareas del trabajo, la aplicación cliente que ejecuta el trabajo o ambos. Las tareas escriben datos de salida en el sistema de archivos de un nodo de proceso de Batch, pero todos los datos del nodo se pierden al restablecer su imagen inicial o cuando el nodo abandona el grupo. Las tareas también pueden tener un período de retención de archivos, después del cual se eliminan los archivos creados por la tarea. Por estos motivos, es importante conservar el resultado de la tarea, que podría necesitar más adelante, en un almacén de datos como Azure Storage.

Para conocer las opciones de cuenta de almacenamiento en Batch, consulte Cuentas de Batch y de Azure Storage.

Puede guardar los datos de tarea de Azure Batch mediante la biblioteca de convenciones de archivo para .NET. La biblioteca de convenciones de archivo simplifica el proceso de almacenamiento y recuperación de los datos de salida de tareas en Azure Storage. Puede usar la biblioteca de convenciones de archivo en el código de tarea y en el de cliente. En el modo de tarea, use la biblioteca para guardar los archivos. En el modo de cliente, use la biblioteca para enumerar y recuperar archivos. El código de la tarea también puede recuperar las salidas de las tareas precedentes de la cadena mediante la biblioteca, como en un escenario con dependencias entre tareas.

Para recuperar archivos de salida con la biblioteca de convenciones de archivo, busque los archivos de un trabajo o tarea. No es necesario conocer los nombres o ubicaciones de los archivos. En su lugar, puede enumerar los archivos por identificador y propósito. Por ejemplo, enumere todos los archivos intermedios de una tarea determinada. O bien, obtenga una vista previa del archivo de un trabajo determinado.

Empezando por la versión del 1 de mayo de 2017, la API del servicio Batch permite guardar datos de salida en Azure Storage para tareas simples y tareas de administrador de trabajos que se ejecutan en los grupos creados con la configuración de máquina virtual (VM). Puede guardar la salida desde dentro del código que crea una tarea. Este método es una alternativa a la biblioteca de convenciones de archivo. Puede modificar las aplicaciones de cliente de Batch para guardar la salida sin necesidad de actualizar la aplicación que la tarea está ejecutando. Para más información, consulte Almacenamiento de datos de tareas en Azure Storage con la API del servicio Batch.

Casos de uso de la biblioteca

Azure Batch proporciona varias maneras de guardar la salida de la tarea. Use la biblioteca de convenciones de archivo cuando desee:

  • Modifique el código de la aplicación que ejecuta la tarea para guardar los archivos.
  • Transmita datos a Azure Storage mientras la tarea está aún en funcionamiento.
  • Guarde los datos de los grupos.
  • Busque y descargue archivos de salida de tareas por identificador o propósito en la aplicación cliente u otras tareas.
  • Vea la salida de tarea en Azure Portal.

En otros escenarios, es posible que quiera considerar un enfoque diferente. Para obtener más información sobre otras opciones, consulte Guardar salidas de trabajos y tareas en Azure Storage.

¿Qué es el estándar de convenciones de archivo de Batch?

El estándar de convenciones de archivo de Batch proporciona un esquema de nombres para los contenedores de destino y las rutas de acceso de blob en los que se escriben los archivos de salida. Los archivos guardados en Azure Storage que siguen el estándar se pueden ver automáticamente en Azure Portal.

La biblioteca de convenciones de archivo para .NET asigna automáticamente nombres a los contenedores de almacenamiento y a los archivos de salidas de tareas según el estándar. La biblioteca también proporciona métodos para consultar los archivos de salida en Azure Storage. Puede consultar por identificador de trabajo, identificador de tarea o propósito.

Si va a desarrollar con un lenguaje distinto de. NET, puede implementar el estándar de convenciones de archivo en su aplicación. Para más información, consulte Implementar el estándar Batch File Conventions.

Para guardar los datos de salida en Azure Storage mediante la biblioteca de convenciones de archivo, vincule primero una cuenta de Azure Storage a su cuenta de Batch.

  1. Inicie sesión en Azure Portal.
  2. Busque y seleccione Batch en la barra de búsqueda.
  3. Seleccione la cuenta de Batch que se vinculará con Azure Storage.
  4. En la página de la cuenta de Batch, en Configuración, seleccione Cuenta de Storage.
  5. Si no dispone de una cuenta de Azure Storage asociada con su cuenta de Batch, seleccione Storage Account (None) [Cuenta de Storage (ninguna)].
  6. Seleccione la cuenta de Azure Storage que desea usar. Para obtener el mejor rendimiento, use una cuenta en la misma región que la cuenta de Batch.

Guardar datos de salida

Puede guardar los datos de salida de trabajos y tareas con la biblioteca de convenciones de archivo. En primer lugar, cree un contenedor en Azure Storage. A continuación, guarde la salida en el contenedor. Use la biblioteca de cliente de Azure Storage para .NET en el código de tarea para cargar la salida de la tarea en el contenedor.

Para más información sobre el trabajo con contenedores y blobs en Azure Storage, consulte Introducción al Almacenamiento de blobs de Azure mediante .NET.

Todas las salidas de trabajos y tareas guardados con la biblioteca de convenciones de archivo se almacenan en el mismo contenedor. Si un gran número de tareas intenta guardar archivos al mismo tiempo, se pueden aplicar los límites de almacenamiento de Azure Storage. Para obtener más información, consulte Lista de comprobación de rendimiento y escalabilidad de Blob Storage.

Creación de contenedores de almacenamiento

Para guardar las salidas de tareas en Azure Storage, primero cree un contenedor mediante una llamada a CloudJob.PrepareOutputStorageAsync. Este método de extensión toma un objeto CloudStorageAccount como parámetro. El método crea un contenedor con un nombre establecido en función del estándar de convenciones de archivo. Azure Portal y los métodos de recuperación descritos en este artículo pueden detectar el contenido del contenedor.

Normalmente, se crea un contenedor en la aplicación cliente, que crea los grupos, los trabajos y las tareas. Por ejemplo:

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

Almacenamiento de las salidas de tarea

Después de crear el contenedor de almacenamiento,, las tareas pueden guardar la salida en el contenedor mediante TaskOutputStorage. Esta clase está disponible en la biblioteca de convenciones de archivo.

En el código de tarea, cree un objeto TaskOutputStorage. Cuando la tarea complete su trabajo, llame al método TaskOutputStorage.SaveAsync. Este paso guarda la salida en Azure Storage.

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

El parámetro kind del método TaskOutputStorage.SaveAsync permite clasificar los archivos guardados. Hay cuatro tipos predefinidos de TaskOutputKind: TaskOutput, TaskPreview, TaskLog y TaskIntermediate.. También puede definir categorías personalizadas de salida.

Especifique qué tipo de salidas se enumerarán al consultar Batch más adelante. A continuación, cuando muestra las salidas de una tarea, puede filtrar por uno de los tipos de salida. Por ejemplo, filtre por "Give me the preview output for task 109". Para obtener más información, consulte Recuperación de datos de salidas.

El tipo de salida también determina dónde se mostrará un archivo de salida en Azure Portal. Los archivos de la categoría TaskOutput se encuentran en Archivos de salida de tarea. Los archivos de la categoría TaskLog se encuentran en Registros de tareas.

Almacenamiento de salidas de trabajos

También puede almacenar las salidas asociadas a un trabajo completo. Por ejemplo, en la tarea de combinación de un trabajo de representación de una película, podría guardar la película totalmente representada como una salida de trabajo. Cuando se completa el trabajo, la aplicación cliente puede enumerar y recuperar las salidas del trabajo. La aplicación cliente no tiene que consultar las tareas individuales.

Almacene la salida del trabajo mediante una llamada al método JobOutputStorage.SaveAsync. Especifique JobOutputKind y el nombre de archivo. Por ejemplo:

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

Al igual que con el tipo TaskOutputKind para las salidas de tareas, utilice el tipo JobOutputKind para clasificar los archivos guardados de un trabajo. Más adelante, puede enumerar un tipo específico de salida. El tipo JobOutputKind incluye las categorías de salida y de vista previa. El tipo también admite la creación de categorías personalizadas.

Almacenamiento de los registros de tareas

También es posible que tenga que guardar los archivos que se actualizan durante la ejecución de una tarea. Por ejemplo, es posible que tenga que guardar los archivos de registro o stdout.txt y stderr.txt. La biblioteca de convenciones de archivo proporciona el método TaskOutputStorage.SaveTrackedAsync para guardar estos tipos de archivos. Realice un seguimiento de las actualizaciones de un archivo en el nodo en un intervalo especificado con SaveTrackedAsync. A continuación, guarde esas actualizaciones en Azure Storage.

En el siguiente ejemplo se utiliza SaveTrackedAsync para actualizar stdout.txt en Azure Storage cada 15 segundos durante la ejecución de la tarea:

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

Reemplace la sección comentada Code to process data and produce output file(s) por cualquier código que la tarea haga normalmente. Por ejemplo, es posible que tenga código que descargue datos desde Azure Storage y, a continuación, realice transformaciones o cálculos. Puede encapsular este código en un bloque using para actualizar periódicamente un archivo con SaveTrackedAsync.

El agente de nodo es un programa que se ejecuta en cada nodo del grupo. Este programa proporciona la interfaz de comandos y control entre el nodo y el servicio Batch. Se necesita la llamada Task.Delay al final de este bloque using. La llamada garantiza que el agente de nodo tenga tiempo de vaciar el contenido del estándar en el archivo stdout.txt del nodo. Sin este retraso, es posible que se pierdan los últimos segundos de salida. Es posible que no necesite este retraso para todos los archivos.

Si habilita el seguimiento de archivos con SaveTrackedAsync, solo se guardan en Azure Storage los anexos al archivo de seguimiento. Utilice este método solo para el seguimiento de archivos de registro no rotatorios u otros archivos escritos con operaciones de anexión al final del archivo.

Recuperación de datos de salidas

Para recuperar archivos de salida de una tarea o trabajo específicos, no es necesario conocer la ruta de acceso en Azure Storage, o bien los nombres de archivo. En su lugar, puede solicitar archivos de salida por el identificador de tarea o trabajo.

El código de ejemplo siguiente recorre en iteración las tareas de un trabajo. A continuación, el código imprime cierta información sobre los archivos de salida de la tarea. A continuación, el código descarga los archivos de 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();
    }
}

Visualización de archivos de salida en Azure Portal

Si los archivos de salida de tareas usan el estándar de convenciones de archivo de Batch, puede ver los archivos en Azure Portal.

Para habilitar la presentación de los archivos de salidas en el portal, debe cumplir con los siguientes requisitos:

Para que los archivos de salida se muestren automáticamente en Azure Portal, debe:

  1. Vincular una cuenta de Azure Storage a la cuenta de Batch.
  2. Seguir las convenciones de nomenclatura predefinidas para contenedores y archivos de Azure Storage. Revise el archivo LÉAME para todas las definiciones. Si utiliza la biblioteca de convenciones de archivo para guardar la salida, los archivos se guardarán según el estándar de convenciones de archivo.

Para ver los registros y los archivos de salida de tareas en Azure Portal:

  1. Inicie sesión en Azure Portal.
  2. Vaya a la tarea para la que desea ver la salida.
  3. Seleccione Archivos de salida guardados o Registros guardados.

Código de ejemplo

El proyecto de ejemplo PersistOutputs es uno de los ejemplos de código de Azure Batch de GitHub. Esta solución de Visual Studio muestra cómo utilizar la biblioteca de convenciones de archivo de Azure Batch para guardar la salida de las tareas en un almacenamiento duradero. Para ejecutar el ejemplo, siga estos pasos:

  1. Abra el proyecto en Visual Studio 2019.
  2. Agregue las credenciales de cuenta de Batch y Azure Storage a AccountSettings.settings en el proyecto Microsoft.Azure.Batch.Samples.Common.
  3. Compile la solución. No ejecute la solución todavía.
  4. Si se le solicita, restaure los paquetes NuGet.
  5. Cargue un paquete de aplicación para PersistOutputsTask a través de Azure Portal.
    1. Incluya el archivo ejecutable PersistOutputsTask.exe y sus ensamblados dependientes en el paquete .zip.
    2. Establezca el id. de aplicación en PersistOutputsTask.
    3. Establezca la versión del paquete de aplicación en 1.0.
  6. Seleccione Iniciar para ejecutar el proyecto.
  7. Cuando se le pida que seleccione la tecnología de persistencia que se usará, escriba 1. Esta opción ejecuta el ejemplo mediante la biblioteca de convenciones de archivo para guardar la salida de la tarea.

Obtención de la biblioteca de convenciones de archivo para .NET de Batch

Esta biblioteca está disponible en NuGet. La biblioteca permite extender las clases CloudJob y CloudTask con nuevos métodos. Para más información, consulte la documentación de referencia de la biblioteca de convenciones de archivo.

El código fuente de la biblioteca de convenciones de archivo está disponible en GitHub.

Pasos siguientes