Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
- Přidejte balíček aplikace do účtu Batch.
- Ověřování pomocí účtů Batch a Storage
- Nahrajte vstupní soubory do úložiště.
- Vytvořte fond výpočetních uzlů pro spuštění aplikace.
- Vytvořte úlohu a úkoly pro zpracování vstupních souborů.
- Monitorování provádění úkolů
- Načtěte výstupní soubory.
V tomto kurzu převedete multimediální soubory MP4 na formát MP3 paralelně pomocí opensourcového nástroje ffmpeg .
Pokud nemáte účet Azure, vytvořte si bezplatný účet před tím, než začnete.
Požadavky
Visual Studio 2017 nebo novější nebo .NET Core SDK pro Linux, macOS nebo Windows
Účet Batch a propojený účet Azure Storage. Pokud chcete tyto účty vytvořit, přečtěte si příručky pro rychlý start služby Batch pro Azure Portal nebo Azure CLI.
Stáhněte si odpovídající verzi nástroje ffmpeg pro váš případ použití do místního počítače. Tento kurz a související ukázková aplikace používají 64bitovou verzi kompletní sestavy ffmpeg 4.3.1 pro Windows. Pro účely tohoto kurzu potřebujete jenom soubor ZIP. Soubor nemusíte rozbalovat ani ho místně instalovat.
Přihlášení k Azure
Přihlaste se k portálu Azure.
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 pro úkoly a jejich nasazení na výpočetní uzly ve fondu.
Na webu Azure portal klikněte na Více služeb>Batch účty, a vyberte název svého účtu Batch.
Klikněte na Aplikace>Přidat.
Do pole ID aplikace zadejte ffmpega do pole Verze zadejte verzi balíčku 4.3.1. Vyberte soubor zip ffmpeg, který jste stáhli, a pak vyberte Odeslat. Balíček aplikace ffmpeg se přidá do vašeho účtu Batch.
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.)
Vyberte Všechny služby>Batch a pak vyberte název vašeho účtu Batch.
Pokud chcete zobrazit přihlašovací údaje služby Batch, vyberte Klíče. Zkopírujte hodnoty Batch účet, URL a Primární přístupový klíč do textového editoru.
Pokud chcete zobrazit název a klíče účtu úložiště, vyberte Účet úložiště. Zkopírujte hodnoty Název účtu úložiště a Klíč1 do textového editoru.
Stažení a spuštění ukázkové aplikace
Stažení ukázkové aplikace
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í ze sady Visual Studio BatchDotNetFfmpegTutorial.sln.
Také se ujistěte, ž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í. Například ve Visual Studio:
Klikněte pravým tlačítkem myši na řešení v Průzkumníku řešení a vyberte 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.
Spusťte řešení. Po spuštění ukázkové aplikace vypadá výstup konzoly zhruba následovně. Během provádění dojde k pozastavení u
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...při spouštění výpočetních uzlů 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 služby Batch na webu Azure Portal. Pokud například chcete zobrazit tepelnou mapu výpočetních uzlů ve vašem fondu, klikněte na Fondy>WinFFmpegPool.
Když se úkoly provádějí, teplotní mapa vypadá přibližně takto:
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.
- Klikněte na Všechny služby>Účty úložiště a potom klikněte na název vašeho účtu úložiště.
- Klikněte na Bloby>výstup.
- 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.
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í zbytku tohoto článku si přečtěte soubor Program.cs v řešení, protože není popsán každý řádek kódu v ukázce.
Autentizujte blob klienty a Batch klienty
K interakci s propojeným účtem úložiště používá aplikace knihovnu Azure.Storage.Blobs pro .NET. Pomocí třídy BlobServiceClient, která přebírá odkaz na identifikátor URI účtu a autentizuje se pomocí tokenu, jako je DefaultAzureCredential.
// TODO: Replace <storage-account-name> with your actual storage account name
Uri accountUri = new Uri("https://<storage-account-name>.blob.core.windows.net/");
BlobServiceClient blobClient = new BlobServiceClient(accountUri, new DefaultAzureCredential());
Aplikace vytvoří odkaz na BatchAccountResource prostřednictvím ArmClient Resource Manageru, aby vytvořila fond ve službě Batch. V této ukázce klient Arm používá ověřování DefaultAzureCredential.
ArmClient _armClient = new ArmClient(new DefaultAzureCredential());
var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();
Aplikace vytvoří objekt BatchClient pro vytváření prací a úkolů ve službě Batch. Klient Batch ve vzorovém příkladu používá ověřování DefaultAzureCredential.
// TODO: Replace <batch-account-name> with your actual storage account name
Uri batchUri = new Uri("https://<batch-account-name>t.eastus.batch.azure.com");
BatchClient _batchClient = new BatchClient(batchUri, new DefaultAzureCredential());
Nahrání vstupních souborů
Aplikace předá objekt blobServerClient do metody CreateContainerIfNotExist, která vytvoří kontejner úložiště pro vstupní soubory (ve formátu MP4) a kontejner pro výstup úkolů.
CreateContainerIfNotExist(blobClient, inputContainerName);
CreateContainerIfNotExist(blobClient, outputContainerName);
Potom se soubory nahrají do vstupního kontejneru 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ů.
Při nahrávání souborů se do Program.cs zapojují dvě metody:
-
UploadFilesToContainerAsync: Vrací kolekciResourceFileobjektů a interně voláUploadResourceFileToContainerAsync, aby nahrál každý soubor předaný v parametruinputFilePaths. -
UploadResourceFileToContainerAsync: Nahraje každý soubor jako datový objekt do vstupního kontejneru. Po nahrání souboru získá sdílený přístupový podpis (SAS) pro blob a vrátíResourceFileobjekt, který ho bude představovat.
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ření fondu výpočetních uzlů
Následně příklad prostřednictvím volání na CreatePoolIfNotExistAsync vytvoří na účtu Batch fond výpočetních uzlů. Tato definovaná metoda používá metodu BatchAccountResource.GetBatchAccountPools().CreateOrUpdateAsync k nastavení počtu uzlů, velikosti virtuálního počítače a konfigurace fondu. V této části objekt BatchVmConfiguration určuje BatchImageReference k obrazu Windows Server publikovanému 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ď nebo obojí ve fondech. 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 přestanou být dostupné, 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:
Nezapomeňte zkontrolovat kvóty uzlů. Pokyny k vytvoření žádosti o kvótu najdete v tématu Kvóty a omezení služby Batch.
Aplikace ffmpeg se do výpočetních uzlů nasazuje přidáním odkazu ApplicationPackageReference do konfigurace fondu.
var credential = new DefaultAzureCredential();
ArmClient _armClient = new ArmClient(credential);
var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();
BatchAccountPoolCollection collection = batchAccount.GetBatchAccountPools();
if (collection.Exists(poolId) == false)
{
var poolName = poolId;
var imageReference = new BatchImageReference()
{
Publisher = "MicrosoftWindowsServer",
Offer = "WindowsServer",
Sku = "2019-datacenter-smalldisk",
Version = "latest"
};
string nodeAgentSku = "batch.node.windows amd64";
ArmOperation<BatchAccountPoolResource> armOperation = await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(
WaitUntil.Completed, poolName, new BatchAccountPoolData()
{
VmSize = "Standard_DS1_v2",
DeploymentConfiguration = new BatchDeploymentConfiguration()
{
VmConfiguration = new BatchVmConfiguration(imageReference, nodeAgentSku)
},
ScaleSettings = new BatchAccountPoolScaleSettings()
{
FixedScale = new BatchAccountFixedScaleSettings()
{
TargetDedicatedNodes = DedicatedNodeCount,
TargetLowPriorityNodes = LowPriorityNodeCount
}
},
Identity = new ManagedServiceIdentity(ManagedServiceIdentityType.UserAssigned)
{
UserAssignedIdentities =
{
[new ResourceIdentifier(ManagedIdentityId)] = new Azure.ResourceManager.Models.UserAssignedIdentity(),
},
},
ApplicationPackages =
{
new Azure.ResourceManager.Batch.Models.BatchApplicationPackageReference(new ResourceIdentifier(appPackageResourceID))
{
Version = appPackageVersion,
}
},
});
BatchAccountPoolResource pool = armOperation.Value;
Vytvořit práci
** Úloha služby Batch určí fond, ve kterém se budou spouštět úkoly, a volitelná nastavení, například priority a plánování úkolů. Ukázka vytvoří úlohu zavoláním metody CreateJobAsync. Tato definovaná metoda používá metodu BatchClient.CreateJobAsync k vytvoření úlohy ve vašem fondu.
BatchJobCreateContent batchJobCreateContent = new BatchJobCreateContent(jobId, new BatchPoolInfo { PoolId = poolId });
await batchClient.CreateJobAsync(batchJobCreateContent);
Vytvoření úkolů
Ukázkový příklad vytvoří úkoly v rámci úlohy pomocí volání metody AddTasksAsync, která vytváří seznam objektů BatchTask. Každý BatchTask spouští ffmpeg k zpracování vstupního objektu ResourceFile pomocí vlastnosti CommandLine. ffmpeg byl již dříve nainstalován na každý uzel, když byl fond vytvořen. 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ě. Poznamenejte si podmínky nastavené u objektu outputFile . Výstupní soubor z úkolu se nahraje do kontejneru jenom po úspěšném dokončení úkolu (OutputFileUploadCondition.TaskSuccess). Další podrobnosti implementace najdete v úplném příkladu kódu na GitHubu.
Pak ukázkový příklad přidá úlohy do úlohy pomocí metody CreateTaskAsync, která je zařadí do fronty ke spuštění na výpočetních uzlech.
Cestu spustitelného souboru nahraďte názvem stažené verze. Tento vzorový kód používá příklad ffmpeg-4.3.1-2020-11-08-full_build.
// Create a collection to hold the tasks added to the job:
List<BatchTaskCreateContent> tasks = new List<BatchTaskCreateContent>();
for (int i = 0; i < inputFiles.Count; i++)
{
// Assign a task ID for each iteration
string taskId = String.Format("Task{0}", i);
// Define task command line to convert the video format from MP4 to MP3 using ffmpeg.
// Note that ffmpeg syntax specifies the format as the file extension of the input file
// and the output file respectively. In this case inputs are MP4.
string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion);
string inputMediaFile = inputFiles[i].StorageContainerUrl;
string outputMediaFile = String.Format("{0}{1}",
System.IO.Path.GetFileNameWithoutExtension(inputMediaFile),
".mp3");
string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-4.3.1-2020-11-08-full_build\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile);
// Create a batch task (with the task ID and command line) and add it to the task list
BatchTaskCreateContent batchTaskCreateContent = new BatchTaskCreateContent(taskId, taskCommandLine);
batchTaskCreateContent.ResourceFiles.Add(inputFiles[i]);
// Task output file will be uploaded to the output container in Storage.
// TODO: Replace <storage-account-name> with your actual storage account name
OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination("https://<storage-account-name>.blob.core.windows.net/output/" + outputMediaFile)
{
IdentityReference = inputFiles[i].IdentityReference,
};
OutputFile outputFile = new OutputFile(outputMediaFile,
new OutputFileDestination() { Container = outputContainer },
new OutputFileUploadConfig(OutputFileUploadCondition.TaskSuccess));
batchTaskCreateContent.OutputFiles.Add(outputFile);
tasks.Add(batchTaskCreateContent);
}
// Call BatchClient.CreateTaskCollectionAsync() to add the tasks as a collection rather than making a
// separate call for each. Bulk task submission helps to ensure efficient underlying API
// calls to the Batch service.
await batchClient.CreateTaskCollectionAsync(jobId, new BatchTaskGroup(tasks));
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. BatchClient má metodu pro odstranění úlohy DeleteJobAsync a odstranění fondu DeletePoolAsync, které jsou volány, pokud potvrdíte smazání. I když se vám neúčtují poplatky za úlohy a úlohy samotné, úč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í všechny výstupy úkolů na 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, jak:
- Přidejte balíček aplikace do účtu Batch.
- Ověřování pomocí účtů Batch a Storage
- Nahrajte vstupní soubory do úložiště.
- Vytvořte fond výpočetních uzlů pro spuštění aplikace.
- Vytvořte úlohu a úkoly pro zpracování vstupních souborů.
- Monitorování provádění úkolů
- Načtěte výstupní soubory.
Další příklady použití rozhraní .NET API k plánování a zpracování úloh Batch najdete v ukázkách Batch C# na GitHubu.