Rychlý start: Spuštění první úlohy služby Azure Batch pomocí rozhraní API .NET

Začínáme s Azure Batch spuštěním úlohy z aplikace C# založené na rozhraní API Azure Batch .NET. Aplikace odešle několik vstupních datových souborů do služby Azure Storage a potom vytvoří fond výpočetních uzlů služby Batch (virtuálních počítačů). Potom vytvoří ukázkovou úlohu, která pomocí základního příkazu spouští úkoly pro zpracování jednotlivých vstupních souborů ve fondu.

Po dokončení tohoto rychlého startu pochopíte klíčové koncepty služby Batch a budete připraveni službu Batch vyzkoušet s realističtějšími úlohami ve větším měřítku.

Diagram showing an overview of the Azure Batch app workflow.

Požadavky

Přihlášení k Azure

Přihlaste se k webu Azure Portal na adrese https://portal.azure.com.

Získání přihlašovacích údajů k účtu

V tomto příkladu musíte zadat přihlašovací údaje pro účty služeb Batch a Storage. Na webu Azure Portal je snadný způsob, jak získat potřebné přihlašovací údaje. (Tyto přihlašovací údaje můžete také získat pomocí rozhraní API Azure nebo nástrojů příkazového řádku.)

  1. Vyberte Všechny účtyBatch služeb> a pak vyberte název účtu Batch.

  2. Pokud chcete zobrazit přihlašovací údaje služby Batch, vyberte Klíče. Zkopíruje hodnoty Účet Batch, URL a Primární přístupová klíč do textového editoru.

  3. Pokud chcete zobrazit název a klíče účtu Storage, vyberte Storage účet. Zkopírujte hodnoty Název účtu úložiště a Klíč1 do textového editoru.

Stažení ukázky

Stáhněte nebo naklonujte ukázkovou aplikaci z GitHubu. K naklonování úložiště ukázkové aplikace pomocí klienta Git použijte následující příkaz:

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

Přejděte do adresáře, který obsahuje soubor řešení sady Visual Studio BatchDotNetQuickstart.sln.

Otevřete soubor řešení v sadě Visual Studio a aktualizujte řetězce přihlašovacích údajů v souboru Program.cs pomocí hodnot, které jste získali pro své účty. Příklad:

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

Poznámka

V zájmu zjednodušení tohoto příkladu se přihlašovací údaje k účtům služeb Batch a Storage zobrazují ve formátu prostého textu. V praxi doporučujeme přístup k přihlašovacím údajům omezit a odkazovat na ně v kódu pomocí proměnných prostředí nebo konfiguračního souboru. Příklady najdete v úložišti ukázek kódu služby Azure Batch.

Sestavte a spusťte aplikaci.

Pokud chcete vidět pracovní postup služby Batch v praxi, sestavte a spusťte aplikaci v sadě Visual Studio nebo na příkazovém řádku pomocí příkazů dotnet build a dotnet run. Po spuštění aplikace se podívejte do kódu a najděte si, co jednotlivé části aplikace dělají. Příklad pro sadu Visual Studio:

  • Klikněte na řešení pravým tlačítkem myši v Průzkumníku řešení a klikněte na Sestavit řešení.

  • Pokud se zobrazí výzva, potvrďte obnovení všech balíčků NuGet. Pokud potřebujete stáhnout chybějící balíčky, ujistěte se, že máte nainstalovaného Správce balíčků NuGet.

Po spuštění ukázkové aplikace vypadá výstup konzoly zhruba následovně. Během provádění dojde k pozastavení na řádku Monitoring all tasks for 'Completed' state, timeout in 00:30:00... a mezitím se spustí výpočetní uzly fondu. Jakmile se spustí první výpočetní uzel, úkoly se zařadí do fronty ke spuštění. V Azure Portal přejděte ke svému účtu Batch, abyste mohli monitorovat fond, výpočetní uzly, úlohy a úkoly.

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

Po dokončení úkolů se pro každý úkol zobrazí výstup podobný tomu následujícímu:

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

Typická doba provádění je přibližně 5 minut, když aplikaci spouštíte ve výchozí konfiguraci. Nejdelší dobu trvá počáteční vytvoření fondu. Pokud chcete úlohu spustit znovu, odstraňte úlohu z předchozího spuštění a neodstraňovat fond. Ve fondu, který je už nakonfigurovaný, se úloha dokončí za pár sekund.

Kontrola kódu

Aplikace .NET v tomto rychlém startu provádí tyto kroky:

  • Odešle tři malé textové soubory do kontejneru objektů blob ve vašem účtu služby Azure Storage. Tyto soubory představují vstup pro zpracování službou Batch.
  • Vytvoří fond výpočetních uzlů se systémem Windows Server.
  • Vytvoří úlohu a tři úkoly ke spuštění v uzlech. Každý úkol zpracovává pomocí příkazového řádku Windows jeden vstupní soubor.
  • Zobrazí soubory vrácené úkoly.

Podrobnosti najdete v souboru Program.cs a v následujících částech.

Nezbytné úkony

Za účelem práce s účtem úložiště aplikace použije klientskou knihovnu služby Azure Storage pro .NET. Vytvoří odkaz na účet pomocí třídy CloudStorageAccount a z té vytvoří třídu CloudBlobClient.

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

Odkaz blobClient slouží aplikaci k vytvoření kontejneru v účtu úložiště a k nahrání datových souborů do tohoto kontejneru. Soubory v úložišti jsou definované jako objekty ResourceFile služby Batch, které může služba Batch později stáhnout do výpočetních uzlů.

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));
}

K vytváření a správě fondů, úloh a úkolů ve službě Batch aplikace vytvoří objekt BatchClient. Klient služby Batch v ukázce používá ověření pomocí sdíleného klíče. (Batch podporuje také ověřování pomocí Azure Active Directory.)

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

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

Vytvořte fond výpočetních uzlů.

K vytvoření fondu služby Batch aplikace používá metodu BatchClient.PoolOperations.CreatePool, která nastavuje počet uzlů, velikost virtuálních počítačů a konfiguraci fondu. Tady objekt VirtualMachineConfiguration určuje odkaz ImageReference na image Windows Serveru publikovanou v Azure Marketplace. Batch podporuje široké spektrum imagí Linuxu a Windows Serveru v Azure Marketplace, ale i vlastní image virtuálních počítačů.

Počet uzlů (PoolNodeCount) a velikost virtuálního počítače (PoolVMSize) jsou definované konstanty. Ukázka ve výchozím nastavení vytvoří fond dvou Standard_A1_v2 uzlů. Navržená velikost nabízí pro tento rychlý příklad dobrou rovnováhu mezi výkonem a náklady.

Metoda Commit odešle fond do služby 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();
    }
...

Vytvoření úlohy Batch

Úloha služby Batch je logická skupina jednoho nebo víc úkolů. Úloha zahrnuje nastavení společná všem úkolům, jako je priorita a fond, ve kterém se mají úkoly spouštět. Aplikace vytvoří úlohu ve vašem fondu pomocí metody BatchClient.JobOperations.CreateJob.

Metoda Commit odešle úlohu do služby Batch. Na začátku úloha neobsahuje žádné úkoly.

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

    job.Commit();
}
...

Vytváření úloh

Aplikace vytvoří seznam objektů CloudTask. Každý úkol zpracovává vstupní objekt ResourceFile pomocí vlastnosti CommandLine. Příkazový řádek v ukázce spustí příkaz Windows type, který zobrazí vstupní soubor. Tento příkaz představuje jednoduchý příklad pro demonstrační účely. Při použití služby Batch se aplikace nebo skript zadávají právě na příkazovém řádku. Batch nabízí několik způsobů, jak nasadit aplikace a skripty do výpočetních uzlů.

Potom aplikace přidá úkoly do úlohy pomocí metody AddTask a ta je zařadí do fronty ke spuštění ve výpočetních uzlech.

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

Zobrazení výstupu úkolu

Aplikace vytvoří položku TaskStateMonitor, která monitoruje úkoly a jejich dokončení. Potom aplikace s využitím vlastnosti CloudTask.ComputeNodeInformation zobrazí soubor stdout.txt vygenerovaný jednotlivými dokončenými úkoly. V případě úspěšného spuštění úkolu se výstup příkazu úkolu zapíše do souboru 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());
}

Vyčištění prostředků

Aplikace automaticky odstraní kontejner úložiště, který vytvoří, a dá vám možnost odstranit fond a úlohu služby Batch. Poplatky se účtují za fond, ve kterém jsou spuštěné uzly, i když nejsou naplánované žádné úlohy. Až fond nebudete potřebovat, odstraňte ho. Po odstranění fondu se odstraní veškerý výstup úkolu na uzlech.

Pokud už je nepotřebujete, odstraňte skupinu prostředků, účet Batch a účet úložiště. Na webu Azure Portal to provedete tak, že vyberete skupinu prostředků účtu Batch a kliknete na Odstranit skupinu prostředků.

Další kroky

V tomto rychlém startu jste spustili malou aplikaci sestavenou pomocí rozhraní API .NET služby Batch a ta vytvořila fond a úlohu služby Batch. Úloha spustila ukázkové úkoly a stáhla výstup vytvořený v uzlech. Teď, když rozumíte klíčovým konceptům služby Batch, můžete službu Batch vyzkoušet s realističtějšími úlohami ve větším měřítku. Další informace o službě Azure Batch a vysvětlení paralelních úloh v reálné aplikaci najdete v kurzu o rozhraní .NET služby Batch.