Kurz: Spuštění paralelní úlohy pomocí služby Azure Batch s využitím rozhraní .NET API

Azure Batch umožňuje efektivně spouštět v Azure rozsáhlé paralelní dávkové úlohy a úlohy vysokovýkonného výpočetního prostředí (HPC). Tento kurz vás provede příkladem spuštění paralelní úlohy pomocí služby Batch v jazyce C#. Seznámíte se s běžným pracovním postupem aplikace Batch a způsobem práce s prostředky služby Batch a Storage prostřednictvím kódu programu. Získáte informace o těchto tématech:

  • Přidání balíčku aplikace do účtu Batch
  • Ověření pomocí účtů Batch a Storage
  • Nahrání vstupních souborů do služby Storage
  • Vytvoření fondu výpočetních uzlů pro spouštění aplikace
  • Vytvoření úlohy a úkolů pro zpracování vstupních souborů
  • Monitorování provádění úkolů
  • Načtení výstupních souborů

V tomto kurzu pomocí open source nástroje ffmpeg paralelně převedete multimediální soubory MP4 do formátu MP3.

Pokud předplatné Azure nemáte, vytvořte si před zahájením bezplatný účet Azure .

Požadavky

Přihlášení k Azure

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

Přidání balíčku aplikace

Pomocí webu Azure Portal přidejte do svého účtu Batch aplikaci ffmpeg jako balíček aplikace. Balíčky aplikací pomáhají spravovat aplikace úkolů a jejich nasazení do výpočetních uzlů ve fondu.

  1. V Azure Portal klikněte na Další účty Služby>Batch a klikněte na název účtu Batch.
  2. Klikněte na Přidat aplikace>.
  3. Pro ID aplikace zadejte ffmpeg a balíček verze 4.3.1. Vyberte soubor zip s aplikací ffmpeg, který jste stáhli dříve, a pak klikněte na OK. Balíček aplikace ffmpeg se přidá do vašeho účtu Batch.

Add application package

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 služby>Batch 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í a spuštění ukázky

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-ffmpeg-tutorial.git

Přejděte do adresáře, který obsahuje soubor řešení sady Visual Studio BatchDotNetFfmpegTutorial.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.

Ujistěte se také, že odkaz na balíček aplikace ffmpeg v řešení odpovídá identifikátoru a verzi balíčku ffmpeg, který jste nahráli do účtu Batch. Příklad: ffmpeg a 4.3.1.

const string appPackageId = "ffmpeg";
const string appPackageVersion = "4.3.1";

Sestavení a spuštění ukázkového projektu

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:

  • V Průzkumník řešení klikněte pravým tlačítkem na ř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.

Potom aplikaci spusťte. 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.

Sample start: 11/19/2018 3:20:21 PM

Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [WinFFmpegPool]...
Creating job [WinFFmpegJob]...
Adding 5 tasks to job [WinFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks completed successfully within the specified timeout period.
Deleting container [input]...

Sample end: 11/19/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742

Fond, výpočetní uzly, úlohy a úkoly můžete sledovat ve svém účtu Batch na webu Azure Portal. Pokud například chcete zobrazit heat mapu výpočetních uzlů ve vašem fondu, klikněte na Fondy>WinFFmpegPool.

Když jsou úkoly spuštěné, heat mapa vypadá přibližně takto:

Pool heat map

Obvyklá doba provádění je přibližně 10 minut, když aplikaci spouštíte v její výchozí konfiguraci. Vytvoření fondu trvá nejdéle.

Načtení výstupních souborů

Můžete použít web Azure Portal ke stažení výstupních souborů MP3 vygenerovaných úlohami ffmpeg.

  1. Klikněte na Všechny služby>Storage účty a potom klikněte na název účtu úložiště.
  2. Klikněte navýstupobjektů blob>.
  3. Klikněte pravým tlačítkem na jeden z výstupních souborů MP3 a potom klikněte na Stáhnout. Podle pokynů v prohlížeči soubor otevřete nebo uložte.

Download output file

Ačkoli to v tomto případě není ukázáno, můžete si také stáhnout soubory prostřednictvím kódu programu z výpočetních uzlů nebo z kontejneru úložiště.

Kontrola kódu

Následující části ukázkovou aplikaci rozdělují do kroků, které aplikace provádí při zpracování úloh ve službě Batch. Při čtení zbývajících částí tohoto článku nahlížejte do souboru Program.cs v rámci řešení, protože tady nezvládneme probrat každý jednotlivý řádek kódu.

Ověřování klientů objektů blob a služby Batch

K interakci s propojeným účtem úložiště aplikace používá klientskou knihovnu služby Azure Storage pro .NET. Pomocí CloudStorageAccount vytvoří referenci na účet a provede ověření pomocí sdíleného klíče. Potom vytvoří CloudBlobClient.

// Construct the Storage account connection string
string storageConnectionString = String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
                                StorageAccountName, StorageAccountKey);

// Retrieve the storage account
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

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. Služba Batch také podporuje ověřování prostřednictvím Azure Active Directory k ověřování jednotlivých uživatelů nebo bezobslužné aplikace.

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

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

Nahrání vstupních souborů

Aplikace předá objekt blobClient do metody CreateContainerIfNotExistAsync, která vytvoří kontejner úložiště pro vstupní soubory (ve formátu MP4) a kontejner pro výstup úkolů.

CreateContainerIfNotExistAsync(blobClient, inputContainerName);
CreateContainerIfNotExistAsync(blobClient, outputContainerName);

Pak se do vstupního kontejneru nahrají soubory z místní složky InputFiles. 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ů.

Na nahrávání souborů se podílejí dvě metody v souboru Program.cs:

  • UploadFilesToContainerAsync: Vrací kolekci objektů ResourceFile a interně volá metodu UploadResourceFileToContainerAsync, která nahraje všechny soubory předané v parametru inputFilePaths.
  • UploadResourceFileToContainerAsync: Nahraje jednotlivé soubory jako objekty blob do vstupního kontejneru. Po nahrání souboru získá sdílený přístupový podpis (SAS) objektu blob a vrátí objekt ResourceFile, který ho zastupuje.
string inputPath = Path.Combine(Environment.CurrentDirectory, "InputFiles");

List<string> inputFilePaths = new List<string>(Directory.GetFileSystemEntries(inputPath, "*.mp4",
    SearchOption.TopDirectoryOnly));

List<ResourceFile> inputFiles = await UploadFilesToContainerAsync(
  blobClient,
  inputContainerName,
  inputFilePaths);

Podrobnosti o nahrávání souborů jako objektů blob do účtu úložiště pomocí .NET najdete v tématu Nahrávání, stahování a výpis objektů blob pomocí .NET.

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

Na účtu Batch potom příklad pomocí volání CreatePoolIfNotExistAsync vytvoří fond výpočetních uzlů. Tato definovaná metoda 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 širokou škálu imagí virtuálních počítačů v Azure Marketplace, ale i vlastní image virtuálních počítačů.

Počet uzlů a velikost virtuálních počítačů jsou definované konstanty. Batch podporuje vyhrazené uzly a spotové uzly a můžete použít buď ve fondech, nebo obojí. Vyhrazené uzly jsou rezervované pro váš fond. Spotové uzly se nabízejí za sníženou cenu z nadbytečné kapacity virtuálních počítačů v Azure. Spotové uzly budou nedostupné, pokud Azure nemá dostatečnou kapacitu. Ukázka ve výchozím nastavení vytvoří fond obsahující pouze 5 spotových uzlů ve velikosti Standard_A1_v2.

Poznámka

Zkontrolujte kvóty uzlů. Pokyny k vytvoření žádosti o kvótu najdete v tématu Kvóty a limity služby Batch .

Aplikace ffmpeg se do výpočetních uzlů nasadí přidáním odkazu ApplicationPackageReference do konfigurace fondu.

Metoda CommitAsync odešle fond do služby Batch.

ImageReference imageReference = new ImageReference(
    publisher: "MicrosoftWindowsServer",
    offer: "WindowsServer",
    sku: "2016-Datacenter-smalldisk",
    version: "latest");

VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.windows amd64");

pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: DedicatedNodeCount,
    targetLowPriorityComputeNodes: LowPriorityNodeCount,
    virtualMachineSize: PoolVMSize,
    virtualMachineConfiguration: virtualMachineConfiguration);

pool.ApplicationPackageReferences = new List<ApplicationPackageReference>
    {
    new ApplicationPackageReference {
    ApplicationId = appPackageId,
    Version = appPackageVersion}};

await pool.CommitAsync();  

Vytvoření úlohy

Úloha služby Batch určí fond, ve kterém se budou spouštět úkoly, a volitelná nastavení, jako je priorita a plán práce. Ukázka vytvoří úlohu zavoláním metody CreateJobAsync. Tato definovaná metoda vytvoří úlohu ve vašem fondu pomocí metody BatchClient.JobOperations.CreateJob.

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

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

await job.CommitAsync();

Vytváření úloh

Ukázka vytvoří v úloze úkoly zavoláním metody AddTasksAsync, která vytvoří seznam objektů CloudTask. Každý objekt CloudTask pomocí vlastnosti CommandLine spouští aplikaci ffmpeg, která zpracuje vstupní objekt ResourceFile. Aplikace ffmpeg se na každý uzel nainstalovala dříve při vytváření fondu. Tady příkazový řádek spouští aplikaci ffmpeg kvůli převodu jednotlivých vstupních souborů MP4 (video) na soubory MP3 (zvuk).

Ukázka po spuštění příkazového řádku vytvoří pro soubor MP3 objekt OutputFile. Výstupní soubory všech úkolů (v tomto případě jednoho) se pomocí vlastnosti OutputFiles nahrají do kontejneru v propojeném účtu úložiště. Dříve v ukázce kódu se získala adresa URL sdíleného přístupového podpisu (outputContainerSasUrl) za účelem poskytnutí přístupu k zápisu do výstupního kontejneru. Poznamenejte si podmínky nastavené na objektu outputFile . Výstupní soubor z úkolu se nahraje jenom do kontejneru po úspěšném dokončení úkolu (OutputFileUploadCondition.TaskSuccess). Další podrobnosti o implementaci najdete v kompletní ukázce kódu na GitHub.

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

Nahraďte cestu k souboru spustitelného souboru názvem verze, kterou jste stáhli. Tento ukázkový kód používá příklad ffmpeg-4.3.1-2020-09-21-full_build.

 // Create a collection to hold the tasks added to the job.
List<CloudTask> tasks = new List<CloudTask>();

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);

    // Define task command line to convert each input file.
    string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion);
    string inputMediaFile = inputFiles[i].FilePath;
    string outputMediaFile = String.Format("{0}{1}",
        System.IO.Path.GetFileNameWithoutExtension(inputMediaFile),
        ".mp3");
    string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-4.3.1-2020-09-21-full_build\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile);

    // Create a cloud task (with the task ID and command line)
    CloudTask task = new CloudTask(taskId, taskCommandLine);
    task.ResourceFiles = new List<ResourceFile> { inputFiles[i] };

    // Task output file
    List<OutputFile> outputFileList = new List<OutputFile>();
    OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination(outputContainerSasUrl);
    OutputFile outputFile = new OutputFile(outputMediaFile,
       new OutputFileDestination(outputContainer),
       new OutputFileUploadOptions(OutputFileUploadCondition.TaskSuccess));
    outputFileList.Add(outputFile);
    task.OutputFiles = outputFileList;
    tasks.Add(task);
}

// Add tasks as a collection
await batchClient.JobOperations.AddTaskAsync(jobId, tasks);
return tasks

Sledování úkolů

Když služba Batch přidá do úlohy úkoly, automaticky je zařadí do fronty a naplánuje jejich spuštění ve výpočetních uzlech v přidruženém fondu. Na základě vámi zadaných nastavení služba Batch zpracuje veškeré řazení úkolů do fronty, plánování úkolů, opakované spouštění a další povinnosti spojené se správou úkolů.

Ke sledování provádění úkolů existuje mnoho přístupů. Tato ukázka definuje metodu MonitorTasks, která hlásí pouze dokončení, selhání úkolu nebo úspěšné stavy. Kód metody MonitorTasks určí ODATADetailLevel, aby se efektivně vybíralo pouze minimum informací o úkolech. Potom vytvoří TaskStateMonitor poskytující pomocné nástroje pro monitorování stavu úloh. V metodě MonitorTasks ukázka čeká na dosažení stavu TaskState.Completed u všech úkolů v časovém limitu. Potom úlohu ukončí a nahlásí všechny úkoly, které se dokončily, ale u kterých pravděpodobně došlo k chybě, například kvůli nenulovému ukončovacímu kódu.

TaskStateMonitor taskStateMonitor = batchClient.Utilities.CreateTaskStateMonitor();
try
{
    await taskStateMonitor.WhenAll(addedTasks, TaskState.Completed, timeout);
}
catch (TimeoutException)
{
    batchClient.JobOperations.TerminateJob(jobId);
    Console.WriteLine(incompleteMessage);
    return false;
}
batchClient.JobOperations.TerminateJob(jobId);
 Console.WriteLine(completeMessage);
...

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

Aplikace po spuštění úkolů automaticky odstraní kontejner vstupního úložiště, který vytvořila, a dá vám možnost odstranit fond a úlohu služby Batch. Třídy JobOperations a PoolOperations v BatchClient obsahují odpovídající metody pro odstranění, které se zavolají, pokud potvrdíte odstranění. I když se vám neúčtují poplatky za úlohy a úkoly jako takové, účtují se vám poplatky za výpočetní uzly. Proto doporučujeme, abyste fondy přidělovali, jen když je to potřeba. Při odstranění fondu se odstraní veškeré výstupy úkolů v uzlech. Výstupní soubory ale zůstanou v účtu úložiště.

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 kurzu jste se naučili:

  • Přidání balíčku aplikace do účtu Batch
  • Ověření pomocí účtů Batch a Storage
  • Nahrání vstupních souborů do služby Storage
  • Vytvoření fondu výpočetních uzlů pro spouštění aplikace
  • Vytvoření úlohy a úkolů pro zpracování vstupních souborů
  • Monitorování provádění úkolů
  • Načtení výstupních souborů

Další příklady použití rozhraní .NET API k plánování a zpracování úloh služby Batch najdete v ukázkách na GitHubu.