Partekatu bidez


Tareas de preparación y ejecución de trabajos en nodos de cálculo de Batch

Un trabajo de Azure Batch suele requerir la instalación antes de que se ejecuten sus tareas y el mantenimiento posterior al trabajo cuando se completen sus tareas. Por ejemplo, es posible que tenga que descargar datos comunes de entrada de tareas en los nodos de proceso o cargar datos de salida de tareas en Azure Storage una vez completado el trabajo. Puede usar tareas de preparación de trabajos y liberación de trabajos 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 que se va a invocar cuando se ejecuta una tarea de preparación o liberación de trabajos. Las tareas de preparación y liberación de trabajos ofrecen características familiares de tareas en lote, como:

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

En este artículo se muestra cómo usar las clases JobPreparationTask y JobReleaseTask en la biblioteca de .NET de Batch .

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 cómputo persiste entre las ejecuciones de trabajos y son utilizados 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 para los escenarios siguientes:

  • Descargue datos comunes de tareas. Los trabajos por lotes suelen requerir un conjunto común de datos como entrada para las tareas de un trabajo. Puede usar una tarea de preparación de trabajos para descargar estos datos en cada nodo antes de la ejecución de las demás tareas del trabajo.

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

  • Eliminación de trabajos y resultado de tareas. 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, es posible que tenga que conservar espacio en disco en los nodos o satisfacer las directivas de seguridad de la organización. Puede usar una tarea de liberación de trabajos para eliminar los datos que descargó una tarea de preparación de trabajos o que generó la ejecución de la tarea.

  • 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 de trabajos para comprimir y cargar estos datos en una cuenta de Azure Storage.

Tarea de preparación de trabajos

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

Si el nodo se reinicia, la tarea de preparación del trabajo se ejecuta de nuevo, pero también puede deshabilitar este comportamiento. Si tiene un trabajo con una tarea de preparación de trabajos y una tarea de administrador de trabajos, la tarea de preparación del trabajo se ejecuta antes de la tarea del administrador de trabajos y antes de 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 nodos programados para ejecutar una tarea. Este comportamiento evita ejecuciones innecesarias en nodos que no tienen asignada ninguna tarea. Es posible que no se asignen tareas 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 se habilita la ejecución simultánea de tareas, lo que deja algunos nodos inactivos si el recuento de tareas es inferior al total posible de tareas simultáneas.

Nota:

JobPreparationTask difiere de CloudPool.StartTask en que se ejecuta al principio de cada trabajo, mientras JobPreparationTask que StartTask solo se ejecuta cuando un nodo de proceso se une primero 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. Para marcar un trabajo como completado, envía una solicitud de terminación. Esta solicitud establece el estado del trabajo en terminación, 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 pasa al estado completado .

Nota:

Al eliminar un trabajo también se ejecuta la tarea de liberación de trabajos. Sin embargo, si ya se ha finalizado un trabajo, la tarea de liberación no se ejecuta una segunda vez si el trabajo se elimina posteriormente.

Las tareas de liberación de trabajos pueden ejecutarse por 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 la API rest.

Preparación y liberación de trabajos con Batch .NET

Para ejecutar una tarea de preparación del trabajo, asigne un objeto JobPreparationTask a la propiedad CloudJob.JobPreparationTask del trabajo. Del mismo modo, para usar una tarea de liberación de trabajos, inicialice un JobReleaseTask y asígnelo a CloudJob.JobReleaseTask del trabajo.

En el siguiente fragmento de código, myBatchClient es una instancia de BatchClient y myPool es un grupo existente dentro de 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, finaliza o elimina un trabajo cuando se completan sus tareas o cuando se alcanza un tiempo de espera 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");

Ejemplo de código en GitHub

Para ver las tareas de preparación y versión del trabajo en acción, 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 preparación del trabajo, liberación y tareas estándar.
  3. Ejecuta la tarea de preparación del trabajo, que escribe primero el identificador de nodo en un archivo de texto en el directorio compartido 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 completadas 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. Detiene la ejecución para permitir la confirmación de la eliminación del trabajo y/o del grupo.

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

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 significan que algunos nodos están listos para tareas antes que otros, por lo que es posible que puedas ver una salida diferente. En concreto, dado que las tareas se completan 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.

Visualización de las tareas de preparación y liberación de trabajos en Azure Portal

Puede usar Azure Portal para ver las propiedades y tareas del trabajo de Batch, incluidas las tareas de preparación y liberación del trabajo. 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 de trabajo en Azure Portal.

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

Captura de pantalla de las propiedades de la tarea de liberación de trabajos en el portal de Azure.

Pasos siguientes