Partilhar via


Tarefas de preparação e liberação de trabalhos em nós de computação em lote

Um trabalho em Lote do Azure geralmente requer configuração antes de suas tarefas serem executadas e manutenção pós-trabalho quando suas tarefas são concluídas. Por exemplo, talvez seja necessário baixar dados comuns de entrada de tarefas para seus nós de computação ou carregar dados de saída de tarefas no Armazenamento do Azure após a conclusão do trabalho. Você pode usar as tarefas de preparação de trabalho e liberação de trabalho para essas operações.

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

Como acontece com outras tarefas em lote, você pode especificar uma linha de comando para invocar quando uma tarefa de preparação ou liberação de trabalho é executada. As tarefas de preparação e liberação de trabalhos oferecem recursos familiares de tarefas em lote, como:

  • Download do arquivo de recurso.
  • Execução de alto nível.
  • Variáveis de ambiente personalizadas.
  • Duração máxima de execução.
  • Contagem de tentativas.
  • Tempo de retenção de ficheiros.

Este artigo mostra como usar as classes JobPreparationTask e JobReleaseTask na biblioteca Batch .NET.

Sugestão

As tarefas de preparação e liberação de trabalhos são especialmente úteis em ambientes de agrupamento partilhado, nos quais um conjunto de nós de computação persiste entre execuções de tarefas e é utilizado por muitas tarefas.

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

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

  • Faça o download dos dados de tarefas comuns. Os trabalhos em lote geralmente exigem um conjunto comum de dados como entrada para as tarefas de um 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, nos cálculos diários de análise de risco, os dados de mercado são específicos do trabalho, mas 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.

  • Exclua a saída do trabalho e da tarefa. Em um ambiente de pool compartilhado, onde os nós de computação de um pool não são desativados entre trabalhos, talvez seja necessário excluir dados de trabalho entre execuções. Por exemplo, talvez seja necessário conservar espaço em disco nos nós ou satisfazer as 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.

  • Retenha registos. Talvez seja a sua intenção manter uma cópia dos ficheiros de log que as suas tarefas geram ou dos ficheiros de despejo em caso de falha gerados por aplicações com erro. Você pode usar uma tarefa de liberação de trabalho para compactar e carregar esses dados em uma conta de Armazenamento do Azure.

Tarefa de preparação do trabalho

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

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

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

Observação

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

Tarefa de liberação de trabalho

Depois de marcar um trabalho como concluído, a tarefa de liberação de trabalho é executada em cada nó do pool que executou uma tarefa de preparação de trabalho. Você marca um trabalho como concluído emitindo uma solicitação de encerramento. Essa solicitação define o estado do trabalho como encerrando, encerra todas as tarefas ativas ou em execução associadas ao trabalho e executa a tarefa de liberação do trabalho. Em seguida, o trabalho passa para o estado concluído .

Observação

A exclusão de 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.

As tarefas de liberação de trabalho podem ser executadas por no máximo 15 minutos antes que o serviço em lote as encerre. Para obter mais informações, veja a Documentação de referência da API REST.

Tarefas de preparação e liberação de trabalhos com o Batch .NET

Para executar 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 uma JobReleaseTask e atribua-a ao CloudJob.JobReleaseTask do seu trabalho.

No trecho de código a seguir, myBatchClient é uma instância de BatchClient e myPool é um pool existente dentro da conta 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();

A tarefa de liberação de 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 suas tarefas são concluídas ou quando um tempo limite definido é 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, crie 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 preparação, liberação e tarefas padrão.
  3. Executa a tarefa de preparação do trabalho, que primeiro grava o ID do nó num ficheiro de texto no diretório partilhado de um nó.
  4. Executa uma tarefa em cada nó que grava o seu ID de tarefa no mesmo arquivo de texto.
  5. Quando todas as tarefas forem concluídas ou o tempo limite for atingido, imprime o conteúdo do ficheiro de texto de cada nó na consola.
  6. Executa a tarefa de liberação de trabalho para excluir o arquivo do nó quando o trabalho for concluído.
  7. Imprime os códigos de saída associados às tarefas de preparação e conclusão para cada nó em que foram executadas.
  8. Pausa a execução para permitir a confirmação da exclusão do trabalho e/ou do pool.

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

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

A variação dos tempos de criação e início dos nós em um novo pool significa que alguns nós estão prontos para tarefas antes de outros, portanto, você pode ver saídas diferentes. 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 tarefas de preparação e liberação de trabalhos no portal do Azure

Você pode usar o portal do Azure para exibir propriedades e tarefas de trabalho em lote, incluindo tarefas de preparação e liberação de trabalho. Na página da Conta de Batch, selecione Tarefas no menu à esquerda e, em seguida, selecione uma tarefa. 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 e o status do trabalho expandindo Contagem aproximada de tarefas na página Visão geral do trabalho ou Tarefas .

Captura de ecrã a mostrar o progresso da tarefa de 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. Este trabalho tinha tarefas de preparação e liberação, para que você possa selecionar Tarefas de preparação ou Liberar tarefas na navegação à esquerda para ver suas propriedades.

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

Próximos passos