Guida introduttiva: Eseguire il primo processo Azure Batch con l'API .NETQuickstart: Run your first Azure Batch job with the .NET API

Questa guida introduttiva esegue un processo Azure Batch da un'applicazione C# compilata con l'API .NET di Azure Batch.This quickstart runs an Azure Batch job from a C# application built on the Azure Batch .NET API. 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).The app uploads several input data files to Azure storage and then creates a pool of Batch compute nodes (virtual machines). Crea quindi un processo di esempio che esegue attività per l'elaborazione di ogni file di input nel pool usando un comando di base.Then, it creates a sample job that runs tasks to process each input file on the pool using a basic command. Dopo aver completato questa guida introduttiva, saranno chiari i concetti fondamentali del servizio Batch e sarà possibile provare Batch con carichi di lavoro più realistici su scala più ampia.After completing this quickstart, you will understand the key concepts of the Batch service and be ready to try Batch with more realistic workloads at larger scale.

Flusso di lavoro dell'app della guida introduttiva

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.If you don't have an Azure subscription, create a free account before you begin.

PrerequisitesPrerequisites

Accedere ad AzureSign in to Azure

Accedere al portale di Azure all'indirizzo https://portal.azure.com.Sign in to the Azure portal at https://portal.azure.com.

Ottenere le credenziali dell'accountGet account credentials

Per questo esempio, è necessario fornire le credenziali per gli account di archiviazione e Batch.For this example, you need to provide credentials for your Batch and Storage accounts. Un modo semplice per ottenere le credenziali necessarie consiste nell'usare il portale di Azure.A straightforward way to get the necessary credentials is in the Azure portal. È anche possibile ottenere le credenziali usando le API di Azure o gli strumenti da riga di comando.(You can also get these credentials using the Azure APIs or command-line tools.)

  1. Selezionare Tutti i servizi > Account Batch e quindi selezionare il nome dell'account Batch.Select All services > Batch accounts, and then select the name of your Batch account.

  2. Per visualizzare le credenziali di Batch, selezionare Chiavi.To see the Batch credentials, select Keys. Copiare i valori di Account Batch, URL e Chiave di accesso primaria in un editor di testo.Copy the values of Batch account, URL, and Primary access key to a text editor.

  3. Per visualizzare il nome e le chiavi dell'account di archiviazione, selezionare Account di archiviazione.To see the Storage account name and keys, select Storage account. Copiare i valori dei campi Nome account di archiviazione e Key1 in un editor di testo.Copy the values of Storage account name and Key1 to a text editor.

Scaricare l'esempioDownload the sample

Scaricare o clonare l'app di esempio da GitHub.Download or clone the sample app from GitHub. Per clonare il repository dell'app di esempio con un client Git, usare il comando seguente:To clone the sample app repo with a Git client, use the following command:

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

Passare alla directory contenente il file di soluzione Visual Studio BatchDotNetQuickstart.sln.Navigate to the directory that contains the Visual Studio solution file 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.Open the solution file in Visual Studio, and update the credential strings in Program.cs with the values you obtained for your accounts. Ad esempio:For example:

// 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.To simplify the example, the Batch and Storage account credentials appear in clear text. In pratica, è consigliabile limitare l'accesso alle credenziali e fare riferimento a esse nel codice usando variabili di ambiente o un file di configurazione.In practice, we recommend that you restrict access to the credentials and refer to them in your code using environment variables or a configuration file. Per alcuni esempi, vedere l'archivio degli esempi di codice di Azure Batch.For examples, see the Azure Batch code samples repo.

Compilare ed eseguire l'appBuild and run the 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.To see the Batch workflow in action, build and run the application in Visual Studio, or at the command line with the dotnet build and dotnet run commands. Dopo l'esecuzione dell'applicazione, esaminare il codice per comprendere le operazioni eseguite da ogni parte dell'applicazione.After running the application, review the code to learn what each part of the application does. Ad esempio, in Visual Studio:For example, in Visual Studio:

  • In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione e scegliere Compila soluzione.Right-click the solution in Solution Explorer, and click Build Solution.

  • Confermare il ripristino di eventuali pacchetti NuGet, se richiesto.Confirm the restoration of any NuGet packages, if you're prompted. Se è necessario scaricare i pacchetti mancanti, verificare che lo strumento Gestione pacchetti NuGet sia installato.If you need to download missing packages, ensure the NuGet Package Manager is installed.

Eseguire quindi lo strumento.Then run it. Quando si esegue l'applicazione di esempio, l'output della console è simile al seguente.When you run the sample application, the console output is similar to the following. 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.During execution, you experience a pause at Monitoring all tasks for 'Completed' state, timeout in 00:30:00... while the pool's compute nodes are started. Le attività vengono accodate per l'esecuzione non appena il primo nodo di calcolo è in esecuzione.Tasks are queued to run as soon as the first compute node is running. Passare all'account Batch nel portale di Azure per monitorare il pool, i nodi di calcolo, il processo e le attività.Go to your Batch account in the Azure portal to monitor the pool, compute nodes, job, and tasks.

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à:After tasks complete, you see output similar to the following for each task:

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.Typical execution time is approximately 5 minutes when you run the application in its default configuration. La maggior parte del tempo è necessaria per la configurazione iniziale del pool.Initial pool setup takes the most time. Per eseguire nuovamente il processo, eliminarlo dall'esecuzione precedente e non eliminare il pool.To run the job again, delete the job from the previous run and do not delete the pool. In un pool preconfigurato, il processo viene completato in pochi secondi.On a preconfigured pool, the job completes in a few seconds.

Esaminare il codiceReview the code

L'app .NET in questa guida introduttiva esegue queste operazioni:The .NET app in this quickstart does the following:

  • Carica tre piccoli file di testo in un contenitore BLOB nell'account di archiviazione di Azure.Uploads three small text files to a blob container in your Azure storage account. Questi file sono input per l'elaborazione da parte di Batch.These files are inputs for processing by Batch.
  • Crea un pool di nodi di calcolo che eseguono Windows Server.Creates a pool of compute nodes running Windows Server.
  • Crea un processo e tre attività da eseguire nei nodi.Creates a job and three tasks to run on the nodes. Ogni attività elabora uno dei file di input tramite una riga di comando di Windows.Each task processes one of the input files using a Windows command line.
  • Visualizza i file restituiti dalle attività.Displays files returned by the tasks.

Per altre informazioni, vedere il file Program.cs e le sezioni seguenti.See the file Program.cs and the following sections for details.

Operazioni preliminariPreliminaries

Per interagire con un account di archiviazione, l'app usa la libreria client di Archiviazione di Azure per .NET.To interact with a storage account, the app uses the Azure Storage Client Library for .NET. Crea un riferimento all'account con CloudStorageAccount, da cui viene quindi creato un oggetto CloudBlobClient.It creates a reference to the account with CloudStorageAccount, and from that creates a 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.The app uses the blobClient reference to create a container in the storage account and to upload data files to the container. I file nel contenitore di archiviazione sono definiti come oggetti ResourceFile di Batch che successivamente Batch può scaricare nei nodi di calcolo.The files in storage are defined as Batch ResourceFile objects that Batch can later download to compute nodes.

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.The app creates a BatchClient object to create and manage pools, jobs, and tasks in the Batch service. Il client Batch nell'esempio usa l'autenticazione con chiave condivisa.The Batch client in the sample uses shared key authentication. Batch supporta anche l'autenticazione di Azure Active Directory.(Batch also supports Azure Active Directory authentication.)

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

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

Creare un pool di nodi di calcoloCreate a pool of compute nodes

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.To create a Batch pool, the app uses the BatchClient.PoolOperations.CreatePool method to set the number of nodes, VM size, and a pool configuration. In questo caso, un oggetto VirtualMachineConfiguration specifica un oggetto ImageReference che fa riferimento a un'immagine di Windows Server pubblicata in Azure Marketplace.Here, a VirtualMachineConfiguration object specifies an ImageReference to a Windows Server image published in the Azure Marketplace. Batch supporta una vasta gamma di immagini di Linux e Windows Server in Azure Marketplace, oltre che immagini di VM personalizzate.Batch supports a wide range of Linux and Windows Server images in the Azure Marketplace, as well as custom VM images.

Il numero di nodi (PoolNodeCount) e le dimensioni delle VM (PoolVMSize) sono costanti definite.The number of nodes (PoolNodeCount) and VM size (PoolVMSize) are defined constants. L'esempio crea per impostazione predefinita un pool con 2 nodi di dimensioni Standard_A1_v2.The sample by default creates a pool of 2 size Standard_A1_v2 nodes. Le dimensioni consigliate offrono un buon compromesso in termini di costi/prestazioni per questo esempio rapido.The size suggested offers a good balance of performance versus cost for this quick example.

Il metodo Commit invia il pool al servizio Batch.The Commit method submits the pool to the Batch service.


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 BatchCreate a Batch job

Un processo Batch è un gruppo logico di una o più attività.A Batch job is a logical grouping of one or more tasks. Un processo include le impostazioni comuni per le attività, ad esempio la priorità e il pool nel quale eseguire le attività.A job includes settings common to the tasks, such as priority and the pool to run tasks on. L'app usa il metodo BatchClient.JobOperations.CreateJob per creare un processo nel pool.The app uses the BatchClient.JobOperations.CreateJob method to create a job on your pool.

Il metodo Commit invia il processo al servizio Batch.The Commit method submits the job to the Batch service. Inizialmente il processo è privo di attività.Initially the job has no tasks.

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

    job.Commit();
}
...

Creare attivitàCreate tasks

L'applicazione crea un elenco di oggetti CloudTask.The app creates a list of CloudTask objects. Ogni attività elabora un oggetto ResourceFile di input usando una proprietà CommandLine.Each task processes an input ResourceFile object using a CommandLine property. Nell'esempio, la riga di comando esegue il comando type di Windows per visualizzare il file di input.In the sample, the command line runs the Windows type command to display the input file. Questo comando è un esempio semplice fornito a scopo dimostrativo.This command is a simple example for demonstration purposes. Quando si usa Batch, in questa riga di comando si specifica l'app o lo script.When you use Batch, the command line is where you specify your app or script. Batch offre una serie di modi per distribuire app e script nei nodi di calcolo.Batch provides a number of ways to deploy apps and scripts to compute nodes.

L'app aggiunge quindi le attività al processo con il metodo AddTask, che le accoda per l'esecuzione nei nodi di calcolo.Then, the app adds tasks to the job with the AddTask method, which queues them to run on the compute nodes.

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àView task output

L'app crea un oggetto TaskStateMonitor per monitorare le attività affinché vengano completate.The app creates a TaskStateMonitor to monitor the tasks to make sure they complete. L'app usa quindi la proprietà CloudTask.ComputeNodeInformation per visualizzare il file stdout.txt generato da ogni attività completata.Then, the app uses the CloudTask.ComputeNodeInformation property to display the stdout.txt file generated by each completed task. Quando l'attività viene eseguita correttamente, l'output del comando dell'attività viene scritto in stdout.txt:When the task runs successfully, the output of the task command is written to 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 risorseClean up resources

L'app elimina automaticamente il contenitore di archiviazione creato e consente di scegliere se eliminare il processo e il pool di Batch.The app automatically deletes the storage container it creates, and gives you the option to delete the Batch pool and job. Vengono addebitati i costi del pool mentre i nodi sono in esecuzione, anche se non sono pianificati processi.You are charged for the pool while the nodes are running, even if no jobs are scheduled. Quando il pool non è più necessario, eliminarlo.When you no longer need the pool, delete it. Quando si elimina il pool, tutto l'output delle attività nei nodi viene eliminato.When you delete the pool, all task output on the nodes is deleted.

Quando non sono più necessari, eliminare il gruppo di risorse, l'account Batch e l'account di archiviazione.When no longer needed, delete the resource group, Batch account, and storage account. A tale scopo, nel portale di Azure selezionare il gruppo di risorse per l'account Batch e fare clic su Elimina gruppo di risorse.To do so in the Azure portal, select the resource group for the Batch account and click Delete resource group.

Passaggi successiviNext steps

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.In this quickstart, you ran a small app built using the Batch .NET API to create a Batch pool and a Batch job. Il processo ha eseguito attività di esempio e ha scaricato l'output creato nei nodi.The job ran sample tasks, and downloaded output created on the nodes. Ora che sono stati appresi i concetti fondamentali del servizio Batch, è possibile provare Batch con carichi di lavoro più realistici su scala più ampia.Now that you understand the key concepts of the Batch service, you are ready to try Batch with more realistic workloads at larger scale. 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.To learn more about Azure Batch, and walk through a parallel workload with a real-world application, continue to the Batch .NET tutorial.