Oktatóanyag: Párhuzamos számításifeladat-futtatás az Azure Batchben a .NET API használatával
Az Azure Batch használatával hatékonyan futtathat nagy méretű párhuzamos és nagy teljesítményű feldolgozási (high-performance computing, HPC) Batch-feladatokat az Azure-ban. Ez az oktatóanyag végigvezeti egy, a Batch segítségével párhuzamos számításifeladat-futtatást bemutató C#-példán. Megismerheti a Batch-alkalmazások általános munkafolyamatát, valamint azt, hogyan kommunikálhat programkódon keresztül a Batch- és Storage-erőforrásokkal. Az alábbiak végrehajtásának módját ismerheti meg:
- Alkalmazáscsomag hozzáadása a Batch-fiókhoz
- Hitelesítés Batch- és Storage-fiókokkal
- Bemeneti fájlok feltöltése a Storage-ba
- Számításicsomópont-készlet létrehozása alkalmazás futtatásához
- Feladatok és tevékenységek létrehozása bemeneti fájlok feldolgozásához
- Tevékenységek végrehajtásának figyelése
- Kimeneti fájlok lekérése
Ebben az oktatóanyagban MP4-médiafájlokat konvertál párhuzamosan MP3 formátumba az ffmpeg nyílt forráskódú eszköz segítségével.
Ha nem rendelkezik Azure-előfizetéssel, a kezdés előtt hozzon létre egy ingyenes Azure-fiókot .
Előfeltételek
2017-Visual Studio vagy újabb, illetve .NET Core 2.1 SDK Linux, macOS vagy Windows.
Egy Batch-fiók és egy társított Azure Storage-fiók. A fiókok létrehozásához tekintse meg a Batch az Azure Portallal vagy az Azure CLI-vel történő használatát ismertető rövid útmutatókat.
Töltse le a használati esethez megfelelő ffmpeg-verziót a helyi számítógépre. Ez az oktatóanyag és a kapcsolódó mintaalkalmazás az ffmpeg 4.3.1 Windows 64 bites verzióját használja. Ebben az oktatóanyagban csak a zip-fájlra lesz szüksége. A fájlt nem kell sem kibontania, sem helyileg telepítenie.
Bejelentkezés az Azure-ba
Jelentkezzen be az Azure Portalra a https://portal.azure.com webhelyen.
Alkalmazáscsomag hozzáadása
Adja hozzá az Azure Portal segítségével az ffmpeg-et a Batch-fiókjához alkalmazáscsomagként. Az alkalmazáscsomagok segítenek a tevékenységalkalmazások kezelésében, valamint a készlet számítási csomópontjain való üzembe helyezésükben.
- A Azure Portal kattintson a További szolgáltatások>Batch-fiókok elemre, és kattintson a Batch-fiók nevére.
- Kattintson az Alkalmazások>hozzáadása elemre.
- Az alkalmazásazonosítóhoz adja meg az ffmpeg értéket, és a 4.3.1-es csomagverziót. Válassza ki a korábban letöltött ffmpeg zip-fájlt, és kattintson az OK gombra. Ezzel hozzáadta az ffmpeg alkalmazáscsomagját a Batch-fiókjához.

Fiók hitelesítő adatainak lekérése
Meg kell adnia például a Batch- és a Storage-fiók hitelesítő adatait. A szükséges hitelesítő adatokat például az Azure Portalon kérheti le egyszerűen. (A hitelesítő adatok az Azure API-k vagy parancssori eszközök használatával is lekérhetők.)
Válassza az Összes szolgáltatás>Batch-fiókját, majd válassza ki a Batch-fiók nevét.
A Batch hitelesítő adatainak megtekintéséhez válassza a Kulcsok lehetőséget. Másolja a Batch-fiók, az URL és az Elsődleges elérési kulcs mező értékét egy szövegszerkesztőbe.
A Storage fiók nevének és kulcsainak megtekintéséhez válassza Storage fiókot. Másolja a Storage-fiók neve és az 1. kulcs mező értékét egy szövegszerkesztőbe.
A minta letöltése és futtatása
A minta letöltése
Töltse le vagy klónozza a mintaalkalmazást a GitHubról. A mintaalkalmazás adattárának Git-ügyféllel történő klónozásához használja az alábbi parancsot:
git clone https://github.com/Azure-Samples/batch-dotnet-ffmpeg-tutorial.git
Váltson a Visual Studio BatchDotNetFfmpegTutorial.sln nevű megoldásfájlját tartalmazó könyvtárra.
Nyissa meg a megoldásfájlt a Visual Studióban, és frissítse a Program.cs hitelesítő adatait a fiókokhoz beszerzett értékekkel. Például:
// 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==";
Megjegyzés
A példa egyszerűsítése érdekében a Batch- és a tárolási fiók hitelesítő adatai titkosítatlan szövegként jelennek meg. A gyakorlatban azt javasoljuk, hogy korlátozza a hozzáférést a hitelesítő adatokhoz, és ezekre környezeti változók vagy egy konfigurációs fájl használatával hivatkozzon a kódban. Példákat az Azure Batch kódmintáinak adattárában talál.
Győződjön meg arról is, hogy a megoldás ffmpeg alkalmazáscsomag-referenciája megegyezik a Batch-fiókba feltöltött ffmpeg-csomag azonosítóval és verziószámával. Például: ffmpeg és 4.3.1.
const string appPackageId = "ffmpeg";
const string appPackageVersion = "4.3.1";
A mintaprojekt létrehozása és futtatása
Hozza létre és futtassa az alkalmazást a Visual Studióban vagy a parancssorban a dotnet build és a dotnet run paranccsal. Az alkalmazás futtatása után tekintse át a kódot annak megismerése érdekében, hogy mit csinálnak az alkalmazás egyes részei. Ha például a Visual Studióban:
Kattintson a jobb gombbal a megoldásra a Megoldáskezelő, és válassza a Megoldás létrehozása parancsot.
Erősítse meg a NuGet-csomagok visszaállítását, ha a rendszer erre kéri. Ha hiányzó csomagokat kell letöltenie, győződjön meg arról, hogy a NuGet-csomagkezelő telepítve van.
Ezután futtassa azt. A mintaalkalmazás futtatásakor a konzol kimenete az alábbihoz hasonló lesz. A futtatás során szünet jelentkezhet a következőnél a készlet számítási csomópontjainak indításakor: Monitoring all tasks for 'Completed' state, timeout in 00:30:00....
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
A készlet, a számítási csomópontok, a feladat és a tevékenységek figyeléséhez lépjen az Azure Portalon a Batch-fiókjába. Ha például a készlet számítási csomópontjainak hőtérképét szeretné megtekinteni, kattintson a Pool>WinFFmpegPool elemre.
A tevékenységek futásakor a hőtérkép az alábbihoz hasonló:

A jellemző végrehajtási idő körülbelül 10 perc, ha az alapértelmezett konfigurációban futtatja az alkalmazást. A készlet létrehozása veszi igénybe a legtöbb időt.
Kimeneti fájlok lekérése
Az Azure Portallal letöltheti az ffmpeg tevékenységek által létrehozott kimenti MP3-fájlokat.
- Kattintson a Minden szolgáltatás>Storage fiók elemre, majd a tárfiók nevére.
- Kattintson a Blobok>kimenete elemre.
- Kattintson a jobb gombbal az egyik kimeneti MP3-fájlra, majd kattintson a Letöltés gombra. Kövesse a böngészőben megjelenő utasításokat a fájl megnyitásához vagy mentéséhez.

Bár ebben a mintában nem látható, programozott módon is letöltheti a fájlokat a számítási csomópontokról vagy a Storage-tárolóból.
A kód áttekintése
A következő szakaszok a mintaalkalmazást felosztják azokra a lépésekre, amelyeket az alkalmazás végrehajt a számítási feladatok a Batch szolgáltatásban történő feldolgozásához. A cikk további részének olvasása közben használja a megoldásban lévő Program.cs fájlt, mert a minta nem minden kódsoráról esik szó a cikkben.
Blob- és Batch-ügyfelek hitelesítése
A társított Storage-fiókkal való kommunikációhoz az alkalmazás a .NET-hez készült Azure Storage ügyféloldali kódtárat használja. Ez létrehoz egy hivatkozást a fiókra egy CloudStorageAccount objektummal, és ehhez megosztott kulcsos hitelesítést használ. Ezután létrehoz egy CloudBlobClient objektumot.
// 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();
Az alkalmazás létrehoz egy BatchClient objektumot a Batch szolgáltatásban lévő készletek, feladatok és tevékenységek létrehozásához és kezeléséhez. A példákban szereplő Batch-ügyfél megosztott kulcsos hitelesítést használ. A Batch Azure Active Directory-hitelesítést is támogat az egyes felhasználók vagy felügyelet nélküli alkalmazások hitelesítéséhez.
BatchSharedKeyCredentials sharedKeyCredentials = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);
using (BatchClient batchClient = BatchClient.Open(sharedKeyCredentials))
...
Bemeneti fájlok feltöltése
Az alkalmazás továbbítja a CreateContainerIfNotExistAsync objektumot a blobClient metódusnak, hogy az létrehozzon egy Storage-tárolót a bemeneti MP4-fájlokhoz, valamint egy tárolót a tevékenység kimenetének.
CreateContainerIfNotExistAsync(blobClient, inputContainerName);
CreateContainerIfNotExistAsync(blobClient, outputContainerName);
Ezt követően a rendszer feltölti a fájlokat a bemeneti tárolóba a helyi InputFiles mappából. A tárolóban lévő fájlokat a rendszer a Batch által később a számítási csomópontra letölthető Batch ResourceFile-objektumként határozza meg.
A Program.cs két metódusa vesz részt a fájlok feltöltésében:
UploadFilesToContainerAsync: A ResourceFile-objektumok gyűjteményét adja vissza, és belsőleg meghívja azUploadResourceFileToContainerAsyncmetódust, hogy feltöltse ainputFilePathsparaméterben átadott fájlokat.UploadResourceFileToContainerAsync: Minden fájlt blobként tölt fel a bemeneti tárolóba. A fájl feltöltése után közös hozzáférésű jogosultságkódot (SAS) szerez be a blobhoz, és visszaadja az azt jelölő ResourceFile-objektumot.
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);
További részleteket a fájlok egy Storage-fiókba a .NET segítségével blobként történő feltöltéséről a blobok .NET segítségével való feltöltését, letöltését és listázását ismertető cikkben talál.
Számításicsomópont-készlet létrehozása
A következő lépésben a minta létrehozza a számítási csomópontok készletét a Batch-fiókban a CreatePoolIfNotExistAsync hívásával. Ez a meghatározott metódus a BatchClient.PoolOperations.CreatePool metódussal adja meg a csomópontok számát, a virtuális gép méretét és a készletkonfigurációt. Itt egy VirtualMachineConfiguration objektum megad egy ImageReference objektumot egy, az Azure Marketplace-en közzétett Windows Server-rendszerképhez. A Batch az Azure Marketplace virtuálisgép-rendszerképeinek széles választékát támogatja, de egyéni rendszerképeket is használhat.
A csomópontok száma és a virtuális gépek mérete meghatározott állandókkal van megadva. A Batch támogatja a dedikált csomópontokat és a kihasználatlan csomópontokat, és bármelyiket vagy mindkettőt használhatja a készletekben. A dedikált csomópontok a készlet számára vannak fenntartva. A kihasználatlan csomópontok kedvezményes áron érhetők el az Azure-beli többlet virtuálisgép-kapacitásból. A kihasználatlan csomópontok elérhetetlenné válnak, ha az Azure nem rendelkezik elegendő kapacitással. A minta alapértelmezés szerint létrehoz egy készletet, amely csak 5, Standard_A1_v2 méretű kihasználatlan csomópontot tartalmaz.
Megjegyzés
Ellenőrizze a csomópontkvótákat. A kvótakérelmek létrehozásával kapcsolatos utasításokért tekintse meg a Batch szolgáltatás kvótáinak és korlátainak ismertető szakaszát."
Az ffmpeg alkalmazás a számítási csomópontokon egy ApplicationPackageReference a készletkonfigurációhoz történő hozzáadásával lesz telepítve.
A CommitAsync metódus elküldi a készletet a Batch szolgáltatásnak.
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();
Feladat létrehozása
Egy Batch-feladat meghatároz egy készletet, amelyen futtathatók tevékenységek, valamint opcionális beállításokat, például a prioritást és az ütemezést a munkához. A minta a CreateJobAsync hívásával létrehoz egy feladatot. Ez a meghatározott metódus a BatchClient.JobOperations.CreateJob metódussal hoz létre egy feladatot a készleten.
A CommitAsync metódus elküldi a feladatot a Batch szolgáltatásnak. A feladat kezdetben nem tartalmaz tevékenységeket.
CloudJob job = batchClient.JobOperations.CreateJob();
job.Id = JobId;
job.PoolInformation = new PoolInformation { PoolId = PoolId };
await job.CommitAsync();
Tevékenységek létrehozása
A minta tevékenységeket hoz létre a feladatban az AddTasksAsync metódus meghívásával, amely létrehoz egy listát a CloudTask-objektumokról. Minden CloudTask az ffmpeg futtatásával dolgoz fel egy bemeneti ResourceFile-objektumot egy CommandLine tulajdonság segítségével. Az ffmpeg már korábban, a készlet létrehozásakor telepítve lett minden egyes csomóponton. Itt a parancssor az ffmpeg futtatásával konvertálja az egyes bemeneti MP4-videofájlokat MP3-hangfájllá.
A minta a parancssor futtatása után létrehoz egy OutputFile objektumot az MP3-fájlhoz. A rendszer az összes tevékenység kimeneti fájlját (ebben az esetben egyet) feltölti egy, a társított Storage-fiókban lévő tárolóba a tevékenység OutputFiles tulajdonsága segítségével. A kódmintában korábban egy közös hozzáférésű jogosultságkód URL-címét (outputContainerSasUrl) szerezték be, amely írási hozzáférést biztosít a kimeneti tárolóhoz. Jegyezze fel az objektumon outputFile beállított feltételeket. A feladat kimeneti fájlja csak a feladat sikeres befejezése (OutputFileUploadCondition.TaskSuccess) után lesz feltöltve a tárolóba. További megvalósítási részletekért tekintse meg a GitHub teljes kódmintáját.
Ezt követően a minta tevékenységeket ad a feladathoz az AddTaskAsync metódussal, amely várólistára helyezi azokat a számítási csomópontokon való futtatáshoz.
Cserélje le a végrehajtható fájl elérési útját a letöltött verzió nevére. Ez a mintakód a példát ffmpeg-4.3.1-2020-09-21-full_buildhasználja.
// 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
Tevékenységek figyelése
Amikor a Batch tevékenységeket ad egy feladathoz, a szolgáltatás automatikusan várólistára helyezi és ütemezi azok végrehajtását a társított készlet számítási csomópontjain. A Batch a megadott beállítások alapján elvégzi a tevékenységek várólistára helyezésével, ütemezésével, újrapróbálásával kapcsolatos összes feladatot, valamint a tevékenységekhez kapcsolódó egyéb rendszergazdai teendőket.
A tevékenységek végrehajtása sokféleképpen megfigyelhető. Ez a minta meghatároz egy MonitorTasks metódust, amely csak a tevékenységek befejezéséről, illetve a meghiúsult vagy a sikeres állapotról küld jelentést. A MonitorTasks kód meghatároz egy ODATADetailLevel objektumot, amely hatékonyan kiválasztja a lehető legkevesebb információt a tevékenységekről. Ezután létrehoz egy TaskStateMonitor objektumot, amely a tevékenységállapotok figyeléséhez biztosít segédeszközöket. A MonitorTasks metódusban a minta megvárja, amíg minden tevékenység el nem éri a TaskState.Completed állapotot egy adott időkorláton belül. Ezután megszakítja a feladatot, és jelentést készít a befejeződött, de esetleg hibába ütköző tevékenységekről (ahol például a program nem nullás kilépési kódot adott).
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);
...
Az erőforrások eltávolítása
A tevékenységek futtatása után az alkalmazás automatikusan törli a létrehozott bemeneti Storage-tárolót, és felkínálja a Batch-készlet és -feladat törlésének lehetőségét. A BatchClient JobOperations és PoolOperations osztálya is rendelkezik megfelelő törlési metódusokkal, amelyeket a rendszer meghív, ha megerősíti a törlést. Bár magukért a feladatokért és tevékenységekért nem kell fizetnie, a számítási csomópontokért igen. Ezért ajánlott csak szükség szerint lefoglalni a készleteket. A készlet törlésekor a rendszer a csomópont összes tevékenységének kimenetét is törli. A kimeneti fájlok azonban megmaradnak a Storage-fiókban.
Ha már nincs rájuk szükség, törölje az erőforráscsoportot, a Batch-fiókot és a Storage-fiókot. Ehhez az Azure Portalon válassza ki a Batch-fiókhoz tartozó erőforráscsoportot, és kattintson az Erőforráscsoport törlése elemre.
További lépések
Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:
- Alkalmazáscsomag hozzáadása a Batch-fiókhoz
- Hitelesítés Batch- és Storage-fiókokkal
- Bemeneti fájlok feltöltése a Storage-ba
- Számításicsomópont-készlet létrehozása alkalmazás futtatásához
- Feladatok és tevékenységek létrehozása bemeneti fájlok feldolgozásához
- Tevékenységek végrehajtásának figyelése
- Kimeneti fájlok lekérése
Batch-számításifeladatok .NET API használatával történő ütemezésére és feldolgozására a GitHub mintáiban találhat további példákat.