Avvio rapido: Eseguire il primo processo di Azure Batch con l'API .NET

Introduzione ad Azure Batch con l'esecuzione di un processo da un'applicazione C# basata sull'API .NET di Azure Batch. L'applicazione carica più file di dati di input nell'archivio di Azure e quindi crea un pool di nodi di calcolo Batch (macchine virtuali). Crea quindi un processo di esempio che esegue attività per l'elaborazione di ogni file di input nel pool usando un comando di base.

Completando questo argomento di avvio rapido si apprenderanno i concetti di base del servizio Batch e sarà possibile provare a usarlo con carichi di lavoro più realistici e su larga scala.

Diagramma che mostra una panoramica del flusso di lavoro dell'app Azure Batch.

Prerequisiti

Accedere ad Azure

Accedere al portale di Azure all'indirizzo https://portal.azure.com.

Ottenere le credenziali dell'account

Per questo esempio, è necessario fornire le credenziali per gli account di archiviazione e Batch. Un modo semplice per ottenere le credenziali necessarie consiste nell'usare il portale di Azure. È anche possibile ottenere le credenziali usando le API di Azure o gli strumenti da riga di comando.

  1. Selezionare Tutti i servizi>Account Batch e quindi selezionare il nome dell'account Batch.

  2. Per visualizzare le credenziali di Batch, selezionare Chiavi. Copiare i valori di Account Batch, URL e Chiave di accesso primaria in un editor di testo.

  3. Per visualizzare il nome e le chiavi dell'account di archiviazione, selezionare Account di archiviazione. Copiare i valori dei campi Nome account di archiviazione e Key1 in un editor di testo.

Scaricare l'esempio

Scaricare o clonare l'app di esempio da GitHub. Per clonare il repository dell'app di esempio con un client Git, usare il comando seguente:

git clone https://github.com/Azure-Samples/batch-dotnet-quickstart.git

Passare alla directory contenente il file di soluzione Visual Studio BatchDotNetQuickstart.sln.

Aprire il file di soluzione in Visual Studio e aggiornare le stringhe delle credenziali in Program.cs con i valori ottenuti per gli account. Ad esempio:

// Batch account credentials
private const string BatchAccountName = "mybatchaccount";
private const string BatchAccountKey  = "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==";
private const string BatchAccountUrl  = "https://mybatchaccount.mybatchregion.batch.azure.com";

// Storage account credentials
private const string StorageAccountName = "mystorageaccount";
private const string StorageAccountKey  = "xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ==";

Nota

Per semplificare l'esempio, le credenziali dell'account di archiviazione e Batch vengono visualizzate in testo non crittografato. In pratica, è consigliabile limitare l'accesso alle credenziali e fare riferimento a esse nel codice usando variabili di ambiente o un file di configurazione. Per alcuni esempi, vedere l'archivio degli esempi di codice di Azure Batch.

Compilare ed eseguire l'app

Per vedere in azione il flusso di lavoro di Batch, compilare ed eseguire l'applicazione in Visual Studio oppure eseguire i comandi dotnet build e dotnet run dalla riga di comando. Dopo l'esecuzione dell'applicazione, esaminare il codice per comprendere le operazioni eseguite da ogni parte dell'applicazione. Ad esempio, in Visual Studio:

  • In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione e scegliere Compila soluzione.

  • Confermare il ripristino di eventuali pacchetti NuGet, se richiesto. Se è necessario scaricare i pacchetti mancanti, verificare che lo strumento Gestione pacchetti NuGet sia installato.

Quando si esegue l'applicazione di esempio, l'output della console è simile al seguente. Durante l'esecuzione si verifica una pausa in corrispondenza di Monitoring all tasks for 'Completed' state, timeout in 00:30:00... mentre vengono avviati i nodi di calcolo del pool. Le attività vengono accodate per l'esecuzione non appena il primo nodo di calcolo è in esecuzione. Passare all'account Batch nel portale di Azure per monitorare il pool, i nodi di calcolo, il processo e le attività.

Sample start: 11/16/2018 4:02:54 PM

Container [input] created.
Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [DotNetQuickstartPool]...
Creating job [DotNetQuickstartJob]...
Adding 3 tasks to job [DotNetQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

Dopo il completamento delle attività, verrà visualizzato un output simile al seguente per ogni attività:

Printing task output.
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard out:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role in business, engineering, science, and other pursuits that require running lots of automated tasks....
stderr:
...

Se si esegue l'applicazione con la configurazione predefinita, il tempo di esecuzione tipico è di circa 5 minuti. La maggior parte del tempo è necessaria per la configurazione iniziale del pool. Per eseguire di nuovo il processo, eliminare il processo dall'esecuzione precedente e non eliminare il pool. In un pool preconfigurato, il processo viene completato in pochi secondi.

Esaminare il codice

L'app .NET in questa guida introduttiva esegue queste operazioni:

  • Carica tre piccoli file di testo in un contenitore BLOB nell'account di archiviazione di Azure. Questi file sono input per l'elaborazione da parte di Batch.
  • Crea un pool di nodi di calcolo che eseguono Windows Server.
  • Crea un processo e tre attività da eseguire nei nodi. Ogni attività elabora uno dei file di input tramite una riga di comando di Windows.
  • Visualizza i file restituiti dalle attività.

Per altre informazioni, vedere il file Program.cs e le sezioni seguenti.

Operazioni preliminari

Per interagire con un account di archiviazione, l'app usa la libreria client di Archiviazione di Azure per .NET. Crea un riferimento all'account con CloudStorageAccount, da cui viene quindi creato un oggetto CloudBlobClient.

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

L'app usa il riferimento blobClient per creare un contenitore nell'account di archiviazione e caricarvi i file di dati. I file nel contenitore di archiviazione sono definiti come oggetti ResourceFile di Batch che successivamente Batch può scaricare nei nodi di calcolo.

List<string> inputFilePaths = new List<string>
{
    "taskdata0.txt",
    "taskdata1.txt",
    "taskdata2.txt"
};

List<ResourceFile> inputFiles = new List<ResourceFile>();

foreach (string filePath in inputFilePaths)
{
    inputFiles.Add(UploadFileToContainer(blobClient, inputContainerName, filePath));
}

L'app crea un oggetto BatchClient per creare e gestire pool, processi e attività nel servizio Batch. Il client Batch nell'esempio usa l'autenticazione con chiave condivisa. Batch supporta anche l'autenticazione di Azure Active Directory.

BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);

using (BatchClient batchClient = BatchClient.Open(cred))
...

Creare un pool di nodi di calcolo

Per creare un pool Batch, l'app usa il metodo BatchClient.PoolOperations.CreatePool per impostare il numero di nodi, le dimensioni delle VM e una configurazione del pool. In questo caso, un oggetto VirtualMachineConfiguration specifica un oggetto ImageReference che fa riferimento a un'immagine di Windows Server pubblicata in Azure Marketplace. Batch supporta una vasta gamma di immagini di Linux e Windows Server in Azure Marketplace, oltre che immagini di VM personalizzate.

Il numero di nodi (PoolNodeCount) e le dimensioni delle VM (PoolVMSize) sono costanti definite. L'esempio per impostazione predefinita crea un pool di due nodi Standard_A1_v2 . Le dimensioni consigliate offrono un buon compromesso in termini di costi/prestazioni per questo esempio rapido.

Il metodo Commit invia il pool al servizio Batch.


private static VirtualMachineConfiguration CreateVirtualMachineConfiguration(ImageReference imageReference)
{
    return new VirtualMachineConfiguration(
        imageReference: imageReference,
        nodeAgentSkuId: "batch.node.windows amd64");
}

private static ImageReference CreateImageReference()
{
    return new ImageReference(
        publisher: "MicrosoftWindowsServer",
        offer: "WindowsServer",
        sku: "2016-datacenter-smalldisk",
        version: "latest");
}

private static void CreateBatchPool(BatchClient batchClient, VirtualMachineConfiguration vmConfiguration)
{
    try
    {
        CloudPool pool = batchClient.PoolOperations.CreatePool(
            poolId: PoolId,
            targetDedicatedComputeNodes: PoolNodeCount,
            virtualMachineSize: PoolVMSize,
            virtualMachineConfiguration: vmConfiguration);

        pool.Commit();
    }
...

Creare un processo Batch

Un processo Batch è un gruppo logico di una o più attività. Un processo include le impostazioni comuni per le attività, ad esempio la priorità e il pool nel quale eseguire le attività. L'app usa il metodo BatchClient.JobOperations.CreateJob per creare un processo nel pool.

Il metodo Commit invia il processo al servizio Batch. Inizialmente il processo è privo di attività.

try
{
    CloudJob job = batchClient.JobOperations.CreateJob();
    job.Id = JobId;
    job.PoolInformation = new PoolInformation { PoolId = PoolId };

    job.Commit();
}
...

Creare attività

L'applicazione crea un elenco di oggetti CloudTask. Ogni attività elabora un oggetto ResourceFile di input usando una proprietà CommandLine. Nell'esempio, la riga di comando esegue il comando type di Windows per visualizzare il file di input. Questo comando è un esempio semplice fornito a scopo dimostrativo. Quando si usa Batch, in questa riga di comando si specifica l'app o lo script. Batch offre diversi modi per distribuire app e script nei nodi di calcolo.

L'app aggiunge quindi le attività al processo con il metodo AddTask, che le accoda per l'esecuzione nei nodi di calcolo.

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);
    string inputFilename = inputFiles[i].FilePath;
    string taskCommandLine = String.Format("cmd /c type {0}", inputFilename);

    CloudTask task = new CloudTask(taskId, taskCommandLine);
    task.ResourceFiles = new List<ResourceFile> { inputFiles[i] };
    tasks.Add(task);
}

batchClient.JobOperations.AddTask(JobId, tasks);

Visualizzare l'output dell'attività

L'app crea un oggetto TaskStateMonitor per monitorare le attività affinché vengano completate. L'app usa quindi la proprietà CloudTask.ComputeNodeInformation per visualizzare il file stdout.txt generato da ogni attività completata. Quando l'attività viene eseguita correttamente, l'output del comando dell'attività viene scritto in stdout.txt:

foreach (CloudTask task in completedtasks)
{
    string nodeId = String.Format(task.ComputeNodeInformation.ComputeNodeId);
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    Console.WriteLine(task.GetNodeFile(Constants.StandardOutFileName).ReadAsString());
}

Pulire le risorse

L'app elimina automaticamente il contenitore di archiviazione creato e consente di scegliere se eliminare il processo e il pool di Batch. Vengono addebitati i costi del pool mentre i nodi sono in esecuzione, anche se non sono pianificati processi. Quando il pool non è più necessario, eliminarlo. Dopo aver eliminato il pool, viene eliminato tutto l'output dell'attività nei nodi.

Quando non sono più necessari, eliminare il gruppo di risorse, l'account Batch e l'account di archiviazione. A tale scopo, nel portale di Azure selezionare il gruppo di risorse per l'account Batch e fare clic su Elimina gruppo di risorse.

Passaggi successivi

In questa guida introduttiva è stata eseguita una piccola app compilata con l'API .NET di Batch per creare un pool Batch e un processo Batch. Il processo ha eseguito attività di esempio e ha scaricato l'output creato nei nodi. Dopo aver compreso i concetti chiave del servizio Batch, è possibile provare Batch con carichi di lavoro più realistici su larga scala. Per altre informazioni su Azure Batch e la descrizione di un carico di lavoro parallelo con un'applicazione reale, continuare con l'esercitazione su .NET per Batch.