Tarefas de preparação e liberação do trabalho em nós de computação do Lote

Um trabalho em lotes do Azure geralmente requer configuração antes da execução das tarefas e manutenção pós-trabalho quando as tarefas são concluídas. Por exemplo, talvez seja necessário baixar dados de entrada de tarefas comuns nos nós de computação ou carregar dados de saída da tarefa no Armazenamento do Azure depois que o trabalho for concluído. Você pode usar tarefas de preparação de trabalho e de liberação de trabalho para essas operações.

  • Uma tarefa de preparação de trabalho é executada antes das tarefas de um trabalho, em todos os nós de computação agendados para executar pelo menos uma tarefa.
  • A tarefa de liberação do trabalho é executada assim que o trabalho é concluído, em cada nó no pool que executou uma tarefa de preparação do trabalho.

Assim como acontece com outras tarefas de Lote, você pode especificar uma linha de comando para invocar quando uma tarefa de preparação ou liberação de trabalho for executada. As tarefas de preparação e versão do trabalho oferecem recursos de tarefas familiares do Lote, como:

  • Download do arquivo de recurso.
  • Execução elevada.
  • Variáveis de ambiente personalizadas.
  • Duração máxima da execução.
  • Contagem de repetição.
  • Tempo de retenção de arquivo.

Esse artigo mostra como usar as classes JobPreparationTask e JobReleaseTask encontradas na biblioteca .NET do Lote.

Dica

As tarefas de preparação e de liberação são especialmente úteis em ambientes de pool compartilhado, em que um pool de nós de computação persiste entre as execuções de trabalho e usado por vários trabalhos.

Casos de uso para tarefas de preparação e liberação de trabalho

As tarefas de preparação e de liberação de trabalho são uma boa opção nos seguintes cenários:

  • Baixar dados de tarefas comuns. Os trabalhos em lotes geralmente exigem um conjunto comum de dados como entrada para tarefas do trabalho. Você pode usar uma tarefa de preparação de trabalho para baixar esses dados para cada nó antes da execução de outras tarefas do trabalho.

    Por exemplo, em cálculos diários de análise de riscos, os dados de mercado são específico do trabalho, porém, comuns a todas as tarefas no trabalho. Você pode usar uma tarefa de preparação de trabalho para baixar esses dados de mercado, que geralmente têm vários gigabytes de tamanho, para cada nó de computação para que qualquer tarefa executada no nó possa usá-los.

  • Excluir saída de tarefa e de trabalho. Em um ambiente de pool compartilhado, em que nós de computação do pool não são encerrados entre trabalhos, talvez seja necessário excluir os dados entre as execuções do trabalho. Por exemplo, talvez seja necessário conservar espaço em disco nos nós ou atender a políticas de segurança da sua organização. Você pode usar uma tarefa de liberação de trabalho para excluir dados que uma tarefa de preparação de trabalho baixou ou que a execução da tarefa gerou.

  • Reter logs. Convém manter uma cópia dos arquivos de log gerados pelas tarefas ou arquivos de despejo de memória que podem ser gerados pelos aplicativos que falharam. Você pode usar uma tarefa de liberação de trabalho para compactar e carregar esses dados para uma conta de Armazenamento do Microsoft Azure.

tarefa de preparação de trabalho

Antes de executar tarefas de um trabalho, o Lote executa a tarefa de preparação de trabalho em cada nó de computação agendado para executar uma tarefa. Por padrão, o Lote aguarda a conclusão da tarefa de preparação do trabalho antes de executar tarefas de trabalho agendadas, mas você pode configurá-lo para não aguardar.

Se o nó for reiniciado, a tarefa de preparação de trabalho será executada novamente, mas você também poderá desativar esse comportamento. Se você tiver um trabalho com uma tarefa de preparação de trabalho e uma tarefa do gerenciador de trabalho, a tarefa de preparação do trabalho será executada antes da tarefa do gerenciador de trabalho e antes de todas as outras tarefas. A tarefa de preparação de trabalho sempre é executada primeiro.

A tarefa de preparação de trabalho é executada apenas em nós programados para executar uma tarefa. Esse comportamento impede execuções desnecessárias em nós que não estão atribuídos a nenhuma tarefa. Os nós podem não ser atribuídos a nenhuma tarefa quando o número de tarefas de trabalho for menor que o número de nós no pool. Esse comportamento também se aplica quando a execução de tarefas simultâneas é habilitada, o que deixará alguns nós ociosos se a contagem de tarefas for inferior ao total de possíveis tarefas simultâneas.

Observação

JobPreparationTask é diferente de CloudPool.StartTask, visto que JobPreparationTask é executado no início de cada trabalho, enquanto StartTask é executado apenas quando um nó de computação ingressa em um pool pela primeira vez ou é reiniciado.

tarefa de liberação de trabalho

Quando você marca um trabalho como concluído, a tarefa de liberação do trabalho é executada em cada nó no pool que executou uma tarefa de preparação do trabalho. Marcar uma tarefa como concluída emitindo uma solicitação de encerramento. Essa solicitação define o estado do trabalho como encerrando, encerra quaisquer tarefas em execução ou ativas associadas ao trabalho e executa a tarefa de liberação do trabalho. Em seguida, o trabalho é movido para o estado concluído .

Observação

Excluir um trabalho também executa a tarefa de liberação do trabalho. No entanto, se um trabalho já tiver sido encerrado, a tarefa de liberação não será executada uma segunda vez se o trabalho for excluído posteriormente.

Tarefas de liberação de trabalhos podem ser executadas por, no máximo, 15 minutos, antes de serem terminadas pelo serviço do Lote. Para receber mais informações, consulte as documentação de referência da API REST.

Tarefas de preparação e liberação de trabalho com o Lote .NET

Para usar uma tarefa de preparação de trabalho, atribua um objeto JobPreparationTask à propriedade CloudJob.JobPreparationTask do seu trabalho. Da mesma forma, para usar uma tarefa de liberação de trabalho, inicialize um JobReleaseTask e atribua-o a CloudJob.JobReleaseTask do seu trabalho.

No snippet de código a seguir, myBatchClient é uma instância de BatchClientmyPool e é um pool existente dentro da conta do Lote.

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

A tarefa de liberação do trabalho é executada quando um trabalho é encerrado ou excluído. Você encerra um trabalho usando JobOperations.TerminateJobAsync e exclui um trabalho usando JobOperations.DeleteJobAsync. Normalmente você encerra ou exclui um trabalho quando as tarefas são concluídas ou quando um tempo limite definido foi atingido.

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

Exemplo de código no GitHub

Para ver as tarefas de preparação e liberação de trabalho em ação, compile e execute o projeto de exemplo JobPrepRelease do GitHub. Este aplicativo de console executa as seguintes ações:

  1. Cria um pool com dois nós.
  2. Cria um trabalho com tarefas de preparação, de liberação e padrão de trabalho.
  3. Executa a tarefa de preparação de trabalho, que primeiro grava a ID do nó em um arquivo de texto no diretório compartilhado do nó.
  4. Executa uma tarefa em cada nó que grava sua ID de tarefa no mesmo arquivo de texto.
  5. Depois que todas as tarefas forem concluídas ou que o tempo limite for atingido, imprime o conteúdo do arquivo de texto de cada nó no console.
  6. Executa a tarefa de liberação de trabalho para excluir o arquivo do nó quando o trabalho é concluído.
  7. Imprime os códigos de saída das tarefas de preparação e liberação de trabalho para cada nó no qual elas são executadas.
  8. Pausa a execução para permitir a confirmação da exclusão do trabalho e/ou pool.

A saída do aplicativo de exemplo é semelhante ao seguinte exemplo:

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

Observação

As diferentes horas de criação e início de nós em um novo pool significam que alguns nós estão prontos para tarefas antes de outros, portanto, você pode ver uma saída diferente. Especificamente, como as tarefas são concluídas rapidamente, um dos nós do pool pode executar todas as tarefas do trabalho. Se isso ocorrer, as tarefas de preparação e liberação do trabalho não existirão para o nó que não executou nenhuma tarefa.

Exibir as tarefas de preparação e liberação do trabalho no portal do Azure

Você pode usar o portal do Azure para exibir as propriedades e tarefas do trabalho em lotes, incluindo tarefas de preparação e liberação do trabalho. Na página da sua conta do Lote, selecione Trabalhos no painel de navegação esquerdo e selecione um trabalho. Se você executar o aplicativo de exemplo, navegue até a página de trabalho após a conclusão das tarefas, mas antes de excluir o trabalho e o pool.

Você pode monitorar o progresso do trabalho e o status expandindo a Contagem aproximada de tarefas na página Visão geral ou Tarefas do trabalho.

Captura de tela mostrando o progresso da tarefa do trabalho no portal do Azure.

A captura de tela a seguir mostra a página JobPrepReleaseSampleJob após a execução do aplicativo de exemplo. Esse trabalho tinha tarefas de preparação e liberação, para que você possa selecionar Tarefas de preparação ou Tarefas de versão no painel de navegação esquerdo para ver suas propriedades.

Captura de tela mostrando as propriedades da tarefa de versão do trabalho no portal do Azure.

Próximas etapas