Tareas de preparación y liberación de trabajos en nodos de ejecución de Batch

A menudo, Azure Batch requiere una configuración antes de ejecutar sus tareas y un mantenimiento posterior al trabajo una vez completadas sus tareas. Por ejemplo, puede ser necesario descargar los datos de entrada de tareas comunes en los nodos de proceso, o bien cargar datos de salida de tareas en Azure Storage una vez completado el trabajo. Puede usar las tareas de preparación del trabajo y liberación del trabajo para estas operaciones.

  • Una tarea de preparación de trabajo se ejecuta antes de las tareas de un trabajo, en todos los nodos de proceso programados para ejecutar al menos una tarea.
  • Una vez finalizado el trabajo, se ejecuta una tarea de liberación del trabajo en cada nodo del grupo que ha ejecutado una tarea de preparación del trabajo.

Al igual que con otras tareas de Batch, puede especificar una línea de comandos para que se invoque cuando se ejecute una tarea de preparación o liberación. Las tareas de preparación y liberación de trabajos ofrecen características conocidas de tareas de Batch, como:

  • Descarga del archivo de recursos.
  • Ejecución con privilegios elevados.
  • Variables de entorno personalizadas.
  • Duración máxima de la ejecución.
  • Número de reintentos.
  • Tiempo de retención de archivos.

Este artículo muestra cómo utilizar las clases JobPreparationTask y JobReleaseTask en la biblioteca de Batch para .NET.

Sugerencia

Las tareas de preparación y liberación de trabajos son especialmente útiles en entornos de grupo compartido, en los que un grupo de nodos de ejecución persiste entre ejecuciones de trabajo y es utilizado por muchos trabajos.

Casos de uso para tareas de preparación y liberación de trabajos

Las tareas de preparación y liberación de trabajos son una buena opción en los escenarios siguientes:

  • Descarga de datos de tareas comunes. A menudo, los trabajos de Batch requieren un conjunto común de datos como entrada para las tareas de un trabajo. Puede usar una tarea de preparación del trabajo para descargar estos datos en cada nodo antes de la ejecución de otras tareas del trabajo.

    Por ejemplo, en cálculos de análisis de riesgos diarios, los datos de mercado son específicos del trabajo, pero comunes a todas las tareas incluidas en él. Puede usar una tarea de preparación de trabajos para descargar estos datos de mercado, que a menudo tienen un tamaño de varios gigabytes, en cada nodo de ejecución para que cualquier tarea que se ejecute en el nodo pueda usarla.

  • Trabajo persistente y resultado de la tarea. En un entorno de grupo compartido, cuando no se dan de baja los nodos de ejecución de un grupo entre los trabajos, podría ser necesario eliminar datos del trabajo entre ejecuciones. Por ejemplo, puede ser necesario conservar espacio en disco en los nodos o cumplir las directivas de seguridad de su organización. Puede usar una tarea de liberación de trabajos para eliminar los datos que descargó una tarea de preparación del trabajo o esa ejecución de tareas generada.

  • Conservar registros. Puede que desee conservar una copia de los archivos de registro generados por las tareas o los archivos de volcado de memoria generados por aplicaciones con errores. Puede usar una tarea de liberación del trabajo para comprimir y cargar estos datos en una cuenta de Azure Storage.

tarea de preparación del trabajo

Antes de ejecutar las tareas de trabajo, Batch ejecuta la tarea de preparación del trabajo en cada nodo de ejecución programado para ejecutar una tarea. De forma predeterminada, Batch espera a que la tarea de preparación del trabajo se complete antes de ejecutar tareas de trabajo programadas, pero puede configurarlo para que no espere.

Si se reinicia el nodo, la tarea de preparación del trabajo se ejecutará de nuevo, pero también puede deshabilitar este comportamiento. Si tiene un trabajo con una tarea de preparación del trabajo y una tarea del administrador del trabajo, la tarea de preparación del trabajo se ejecuta antes que la tarea del administrador del trabajo, y antes que todas las demás tareas. La tarea de preparación del trabajo siempre se ejecuta primero.

La tarea de preparación del trabajo solo se ejecuta en los nodos programados para ejecutar una tarea. Este comportamiento evita ejecuciones innecesarias en nodos que no tienen asignada ninguna tarea. Es posible que los nodos no se asignen a ninguna tarea cuando el número de tareas de trabajo sea menor que el número de nodos del grupo. Este comportamiento también se aplica cuando la ejecución de tareas simultáneas está habilitada, lo que deja algunos nodos inactivos si el número de tareas es menor que el total de posibles tareas simultáneas.

Nota

JobPreparationTask difiere de CloudPool.StartTask en que JobPreparationTask se ejecuta al principio de cada trabajo, mientras que StartTask solo se ejecuta cuando un nodo de ejecución se une por primera vez a un grupo o se reinicia.

tarea de liberación del trabajo

Una vez que marque un trabajo como completado, se ejecuta la tarea de liberación del trabajo en cada nodo del grupo que ha ejecutado una tarea de preparación del trabajo. El trabajo se marca como completado mediante la emisión de una solicitud de finalización. Esta solicitud establece el estado del trabajo en terminando, finaliza las tareas activas o en ejecución asociadas al trabajo y ejecuta la tarea de liberación del trabajo. A continuación, el trabajo se mueve al estado completado .

Nota

La eliminación de un trabajo también ejecuta la tarea de liberación del trabajo. Sin embargo, si un trabajo ya se ha terminado, la tarea de liberación no se ejecuta una segunda vez si el trabajo se va a eliminar más adelante.

Las tareas de liberación de trabajos pueden ejecutarse durante un máximo de 15 minutos antes de que el servicio Batch las finalice. Para más información, consulte la Documentación de referencia de API de REST.

Tareas de preparación y liberación de trabajos con Batch para .NET

Para ejecutar una tarea de preparación del trabajo, asigne un objeto JobPreparationTask a la propiedad CloudJob.JobPreparationTask del trabajo. De forma similar, para usar una tarea de liberación del trabajo, inicialice una JobReleaseTask y asígnela a la propiedad CloudJob.JobReleaseTask del trabajo.

En el siguiente fragmento de código, myBatchClient es una instancia de BatchClient y myPool es un grupo existente en la cuenta de 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 tarea de liberación del trabajo se ejecuta cuando se finaliza o se elimina un trabajo. Para finalizar un trabajo, use JobOperations.TerminateJobAsync y elimine un trabajo mediante JobOperations.DeleteJobAsync. Normalmente un trabajo se termina o elimina cuando se han completado sus tareas o cuando se ha alcanzado el tiempo de espera que haya definido.

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

Código de ejemplo en GitHub

Para ver cómo funcionan las tareas de preparación y liberación del trabajo, compile y ejecute el proyecto de ejemplo JobPrepRelease desde GitHub. Esta aplicación de consola realiza las siguientes acciones:

  1. Crea un grupo con dos nodos.
  2. Crea un trabajo con las tareas de preparación y de liberación del trabajo, además de las estándar.
  3. Ejecuta la tarea de preparación del trabajo, que en primer lugar escribe el identificador de nodo en un archivo de texto en el directorio shared de un nodo.
  4. Ejecuta una tarea en cada nodo que escribe su identificador de tarea en el mismo archivo de texto.
  5. Una vez que se han completado todas las tareas o se alcanza el tiempo de espera, imprime el contenido del archivo de texto de cada nodo en la consola.
  6. Ejecuta la tarea de liberación del trabajo para eliminar el archivo del nodo cuando se completa el trabajo.
  7. Imprime los códigos de salida de las tareas de preparación y liberación del trabajo para cada nodo en el que se ejecutaron.
  8. Pausa la ejecución para permitir la confirmación de la eliminación del trabajo o el grupo.

La salida de la aplicación de ejemplo es similar al siguiente ejemplo:

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

Nota

Las distintas horas de creación e inicio de los nodos de un nuevo grupo significa que algunos nodos están listos para las tareas anteriores a otras, por lo que es posible que vea una salida diferente. En concreto, como las tareas se realizan rápidamente, uno de los nodos del grupo podría ejecutar todas las tareas del trabajo. Si esto ocurre, las tareas de preparación y liberación del trabajo no existen para el nodo que no ejecutó ninguna tarea.

Ver las tareas de preparación y liberación en Azure Portal

Puede usar Azure Portal para ver las propiedades y las tareas del trabajo de Batch, incluidas las tareas de preparación y liberación de trabajos. En la página de la cuenta de Batch, seleccione Trabajos en el panel de navegación izquierdo y, a continuación, seleccione un trabajo. Si ejecuta la aplicación de ejemplo, vaya a la página del trabajo una vez completadas las tareas, pero antes de eliminar el trabajo y el grupo.

Para supervisar el progreso y el estado del trabajo, expanda Recuento aproximado de tareas en la página Información general o Tareas del trabajo.

Captura de pantalla que muestra el progreso de la tarea en Azure Portal.

En la captura de pantalla siguiente se muestra la página JobPrepReleaseSampleJob después de que se ejecuta la aplicación de ejemplo. Este trabajo tenía tareas de preparación y liberación, por lo que puede seleccionar Tareas de preparación o Tareas de liberación en el panel de navegación izquierdo para ver sus propiedades.

Captura de pantalla que muestra las propiedades de la tarea de liberación del trabajo en Azure Portal.

Pasos siguientes