Manter os dados de tarefas e tarefas no Armazenamento do Azure com a biblioteca de Convenções de Ficheiros do Batch para .NET
Uma tarefa em execução no Azure Batch pode produzir dados de saída quando são executados. Muitas vezes, os dados de saída da tarefa têm de ser armazenados para obtenção por outras tarefas na tarefa, pela aplicação cliente que executou a tarefa ou ambas. As tarefas escrevem dados de saída no sistema de ficheiros de um nó de computação do Batch, mas todos os dados no nó são perdidos quando são recriados ou quando o nó sai do conjunto. As tarefas também podem ter um período de retenção de ficheiros, após o qual os ficheiros criados pela tarefa são eliminados. Por estes motivos, é importante manter a saída da tarefa de que precisará mais tarde para um arquivo de dados, como o Armazenamento do Azure.
Para obter as opções da conta de armazenamento no Batch, veja Contas do Batch e contas de Armazenamento do Azure.
Pode manter os dados de tarefas de Azure Batch através da biblioteca de Convenções de Ficheiros para .NET. A biblioteca de Convenções de Ficheiros simplifica o processo de armazenamento e obtenção de dados de saída de tarefas no Armazenamento do Azure. Pode utilizar a biblioteca de Convenções de Ficheiros no código de tarefa e de cliente. No modo de tarefa, utilize a biblioteca para manter os ficheiros. No modo de cliente, utilize a biblioteca para listar e obter ficheiros. O código de tarefa também pode obter o resultado de tarefas a montante com a biblioteca, como num cenário de dependências de tarefas .
Para obter ficheiros de saída com a biblioteca de Convenções de Ficheiros, localize os ficheiros de uma tarefa ou tarefa. Não precisa de saber os nomes ou localizações dos ficheiros. Em vez disso, pode listar os ficheiros por ID e objetivo. Por exemplo, liste todos os ficheiros intermédios de uma determinada tarefa. Em alternativa, obtenha um ficheiro de pré-visualização para uma determinada tarefa.
A partir da versão 2017-05-01, a API do serviço Batch suporta dados de saída persistentes para o Armazenamento do Azure para tarefas e tarefas de gestor de tarefas executadas em conjuntos criados com a configuração da máquina virtual (VM). Pode manter a saída a partir do código que cria uma tarefa. Este método é uma alternativa à biblioteca de Convenções de Ficheiros. Pode modificar as aplicações cliente do Batch para manter a saída sem ter de atualizar a aplicação que a sua tarefa está a executar. Para obter mais informações, veja Persist task data to Azure Storage with the Batch service API (Persistir dados de tarefas no Armazenamento do Azure com a API de serviço do Batch).
Casos de utilização da biblioteca
Azure Batch fornece várias formas de manter a saída da tarefa. Utilize a biblioteca de Convenções de Ficheiros quando quiser:
- Modifique o código da aplicação que a sua tarefa está a executar para manter os ficheiros.
- Transmitir dados em fluxo para o Armazenamento do Azure enquanto a tarefa ainda estiver em execução.
- Manter os dados dos conjuntos.
- Localize e transfira ficheiros de saída de tarefas por ID ou objetivo na aplicação cliente ou noutras tarefas.
- Ver o resultado da tarefa no portal do Azure.
Noutros cenários, poderá considerar uma abordagem diferente. Para obter mais informações sobre outras opções, veja Manter a saída de tarefas e tarefas para o Armazenamento do Azure.
Qual é o padrão das Convenções de Ficheiros do Batch?
A norma Batch File Conventions (Convenções de Ficheiros do Batch ) fornece um esquema de nomenclatura para os contentores de destino e caminhos de blobs para os quais os ficheiros de saída são escritos. Os ficheiros mantidos no armazenamento do Azure que seguem o padrão são visualizados automaticamente no portal do Azure.
A biblioteca de Convenções de Ficheiros para .NET atribui automaticamente nomes aos contentores de armazenamento e aos ficheiros de saída de tarefas de acordo com a norma. A biblioteca também fornece métodos para consultar ficheiros de saída no Armazenamento do Azure. Pode consultar por ID da tarefa, ID da tarefa ou finalidade.
Se estiver a desenvolver com uma linguagem diferente do .NET, pode implementar o padrão de Convenções de Ficheiros na sua aplicação. Para obter mais informações, veja Implementar a norma Convenções de Ficheiros do Batch.
Ligar uma conta de Armazenamento do Azure
Para manter os dados de saída para o Armazenamento do Azure com a biblioteca de Convenções de Ficheiros, ligue primeiro uma conta de Armazenamento do Azure à sua conta do Batch.
- Inicie sessão no Portal do Azure.
- Procure e selecione Batch na barra de pesquisa.
- Selecione a conta do Batch para ligar ao Armazenamento do Azure.
- Na página Conta do Batch, em Definições, selecione Conta de Armazenamento.
- Se ainda não tiver uma conta de Armazenamento do Azure associada à sua conta do Batch, selecione Conta de Armazenamento (Nenhuma).
- Selecione a conta de Armazenamento do Azure a utilizar. Para obter o melhor desempenho, utilize uma conta na mesma região que a conta do Batch.
Manter dados de saída
Pode manter os dados de saída de tarefas e tarefas com a biblioteca de Convenções de Ficheiros. Primeiro, crie um contentor no Armazenamento do Azure. Em seguida, guarde a saída no contentor. Utilize a biblioteca de cliente do Armazenamento do Microsoft Azure para .NET no código de tarefa para carregar a saída da tarefa para o contentor.
Para obter mais informações sobre como trabalhar com contentores e blobs no Armazenamento do Azure, veja Introdução ao armazenamento de Blobs do Azure com o .NET.
Todas as saídas de tarefas e tarefas mantidas com a biblioteca de Convenções de Ficheiros são armazenadas no mesmo contentor. Se um grande número de tarefas tentar manter os ficheiros ao mesmo tempo, poderão ser impostos limites de limitação do Armazenamento do Microsoft Azure. Para obter mais informações, veja Lista de verificação de desempenho e escalabilidade do Armazenamento de blobs.
Criar contentor de armazenamento
Para manter a saída da tarefa para o Armazenamento do Azure, crie primeiro um contentor ao chamar CloudJob. PrepareOutputStorageAsync. Este método de extensão utiliza um objeto CloudStorageAccount como um parâmetro. O método cria um contentor com o nome de acordo com a norma Convenções de Ficheiros. Os conteúdos do contentor são detetáveis pelo portal do Azure e pelos métodos de obtenção descritos neste artigo.
Normalmente, crie um contentor na sua aplicação cliente, que cria os seus conjuntos, tarefas e tarefas. Por exemplo:
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);
Armazenar saídas de tarefas
Depois de criar o contentor de armazenamento, as tarefas podem guardar a saída no contentor com TaskOutputStorage. Esta classe está disponível na biblioteca de Convenções de Ficheiros.
No código da tarefa, crie um objeto TaskOutputStorage . Quando a tarefa concluir o seu trabalho, chame TaskOutputStorage. Método SaveAsync . Este passo guarda a saída no Armazenamento do Azure.
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");
O kind
parâmetro de TaskOutputStorage. O método SaveAsync categoriza os ficheiros persistentes. Existem quatro tipos predefinidos taskOutputKind : TaskOutput
, TaskPreview
, TaskLog
e TaskIntermediate.
Também pode definir categorias personalizadas de saída.
Especifique o tipo de saídas a listar quando consultar o Batch mais tarde. Em seguida, quando listar os resultados de uma tarefa, pode filtrar um dos tipos de saída. Por exemplo, filtre para "Dê-me o resultado da pré-visualização da tarefa 109". Para obter mais informações, veja Obter dados de saída.
O tipo de saída também determina onde é que um ficheiro de saída aparece no portal do Azure. Os ficheiros na categoria TaskOutput estão em Ficheiros de saída da tarefa. Os ficheiros na categoria TaskLog estão em Registos de tarefas.
Armazenar saídas de tarefas
Também pode armazenar as saídas associadas a uma tarefa inteira. Por exemplo, na tarefa de intercalação de uma tarefa de composição de filmes, pode manter o filme totalmente composto como uma saída de trabalho. Quando a tarefa estiver concluída, a aplicação cliente pode listar e obter as saídas da tarefa. A aplicação cliente não tem de consultar as tarefas individuais.
Armazene o resultado da tarefa ao chamar JobOutputStorage. Método SaveAsync . Especifique JobOutputKind e filename. Por exemplo:
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");
Tal como acontece com o tipo TaskOutputKind para saídas de tarefas, utilize o tipo JobOutputKind para categorizar os ficheiros persistentes de uma tarefa. Mais tarde, pode listar um tipo específico de saída. O tipo JobOutputKind inclui categorias de saída e pré-visualização. O tipo também suporta a criação de categorias personalizadas.
Armazenar registos de tarefas
Também poderá ter de manter os ficheiros que são atualizados durante a execução de uma tarefa. Por exemplo, poderá ter de manter os ficheiros de registo ou stdout.txt
e stderr.txt
. A biblioteca de Convenções de Ficheiros fornece TaskOutputStorage. Método SaveTrackedAsync para manter estes tipos de ficheiros. Controle as atualizações para um ficheiro no nó num intervalo especificado com SaveTrackedAsync. Em seguida, mantenha essas atualizações no Armazenamento do Azure.
O exemplo seguinte utiliza SaveTrackedAsync para atualizar stdout.txt
no Armazenamento do Azure a cada 15 segundos durante a execução da tarefa:
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);
}
Substitua a secção Code to process data and produce output file(s)
comentada pelo código que a sua tarefa faz normalmente. Por exemplo, pode ter código que transfere dados do Armazenamento do Azure e, em seguida, efetua transformações ou cálculos. Pode encapsular este código num using
bloco para atualizar periodicamente um ficheiro com SaveTrackedAsync.
O agente do nó é um programa que é executado em cada nó no conjunto. Este programa fornece a interface de comando e controlo entre o nó e o serviço Batch. A Task.Delay
chamada é necessária no final deste using
bloco. A chamada garante que o agente do nó tem tempo para remover o conteúdo de padrão para o stdout.txt
ficheiro no nó. Sem este atraso, é possível perder os últimos segundos de saída. Poderá não precisar deste atraso para todos os ficheiros.
Quando ativa o controlo de ficheiros com SaveTrackedAsync, apenas os acréscimos ao ficheiro controlado são mantidos no Armazenamento do Azure. Utilize apenas este método para controlar ficheiros de registo não rotativos ou outros ficheiros escritos com operações de acréscimo no final do ficheiro.
Obter dados de saída
Para obter ficheiros de saída para uma tarefa ou tarefa específica, não precisa de saber o caminho no Armazenamento do Azure ou nomes de ficheiros. Em vez disso, pode pedir ficheiros de saída por ID de tarefa ou trabalho.
O código de exemplo seguinte itera através das tarefas de uma tarefa. Em seguida, o código imprime algumas informações sobre os ficheiros de saída da tarefa. Em seguida, o código transfere os ficheiros do 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();
}
}
Ver ficheiros de saída no portal do Azure
Se os ficheiros de saída da tarefa utilizarem a norma Convenções de Ficheiros do Batch, pode ver os ficheiros no portal do Azure.
Para ativar a apresentação dos ficheiros de saída no portal, tem de cumprir os seguintes requisitos:
Para que os ficheiros de saída seja apresentados automaticamente no portal do Azure, tem de:
- Ligue uma conta de Armazenamento do Azure à sua conta do Batch.
- Siga as convenções de nomenclatura predefinidas para contentores e ficheiros do Armazenamento do Azure. Reveja o README para todas as definições. Se utilizar a biblioteca de Convenções de Ficheiros para manter a saída, os seus ficheiros serão mantidos de acordo com a norma Convenções de Ficheiros.
Para ver ficheiros e registos de saída de tarefas no portal do Azure:
- Inicie sessão no Portal do Azure.
- Aceda à tarefa para a qual pretende ver o resultado.
- Selecione Ficheiros de saída guardados ou Registos guardados.
Exemplo de código
O projeto de exemplo PersistOutputs é um dos exemplos de código Azure Batch no GitHub. Esta solução do Visual Studio mostra como utilizar a biblioteca Azure Batch File Conventions para manter a saída da tarefa para o armazenamento durável. Para executar o exemplo, siga estes passos:
- Abra o projeto no Visual Studio 2019.
- Adicione as credenciais da conta de Armazenamento do Batch e do Azure a AccountSettings.settings no projeto Microsoft.Azure.Batch.Samples.Common .
- Compilar a solução. Ainda não execute a solução.
- Se lhe for pedido, restaure quaisquer pacotes NuGet.
- Carregue um pacote de aplicação para PersistOutputsTask através do portal do Azure.
- Inclua o
PersistOutputsTask.exe
executável e as respetivas assemblagens dependentes no pacote de .zip. - Defina o ID da aplicação como
PersistOutputsTask
. - Defina a versão do pacote de aplicação como
1.0
.
- Inclua o
- Selecione Iniciar para executar o projeto.
- Quando lhe for pedido para selecionar a tecnologia de persistência a utilizar, introduza 1. Esta opção executa o exemplo com a biblioteca de Convenções de Ficheiros para manter a saída da tarefa.
Obter a biblioteca de Convenções de Ficheiros do Batch para .NET
A biblioteca de Convenções de Ficheiros do Batch para .NET está disponível no NuGet. A biblioteca expande as classes CloudJob e CloudTask com novos métodos. Para obter mais informações, veja a documentação de referência da biblioteca de Convenções de Ficheiros.
O código fonte da biblioteca de Convenções de Ficheiros está disponível no GitHub.