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.
- Adjon hozzá egy alkalmazáscsomagot a Batch-fiókhoz.
- Hitelesítés Batch- és Storage-fiókokkal.
- Bemeneti fájlok feltöltése a Tárolóba.
- Számítási csomópontok készletének létrehozása egy alkalmazás futtatásához.
- Hozzon létre egy feladatot és feladatokat a bemeneti fájlok feldolgozásához.
- Tevékenység végrehajtásának figyelése.
- Kimeneti fájlok lekérése.
Ebben az oktatóanyagban mp4-médiafájlokat konvertál mp3 formátumba, párhuzamosan az ffmpeg nyílt forráskódú eszközzel.
If you don't have an Azure subscription, create an Azure free account before you begin.
Előfeltételek
Visual Studio 2017 vagy újabb, illetve .NET Core SDK Linuxhoz, macOS-hez vagy Windowshoz.
Egy Batch-fiók és egy társított Azure Storage-fiók. A fiókok létrehozásához tekintse meg az Azure Portalhoz vagy az Azure CLI-hez készült Batch rövid útmutatóit.
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 teljes buildű verzióját használja. Ebben az oktatóanyagban csak a zip-fájlra van szüksége. A fájlt nem kell sem kibontania, sem helyileg telepítenie.
Bejelentkezés az Azure-ba
Jelentkezzen be az Azure Portalra.
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.
Az Azure Portalon kattintson a További szolgáltatások>Batch-fiókok elemre, és válassza ki a Batch-fiók nevét.
Kattintson az Alkalmazások>Hozzáadás elemre.
Írja be az ffmpeg értéket az Alkalmazásazonosító mezőbe, a Verzió mezőbe pedig a 4.3.1-es csomagverziót. Válassza ki a letöltött ffmpeg zip fájlt, majd válassza a Küldés lehetőséget. 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ókja lehetőséget, 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 Tárfiók nevének és kulcsainak megtekintéséhez válassza a Tárfiók lehetőséget. Másolja a Storage-fiók neve és az 1. kulcs mező értékét egy szövegszerkesztőbe.
A mintaalkalmazás letöltése és futtatása
A mintaalkalmazás 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
Lépjen a BatchDotNetFfmpegTutorial.sln Visual Studio-megoldásfájlt tartalmazó könyvtárra.
Nyissa meg a megoldásfájlt a Visual Studióban, és frissítse a Program.cs hitelesítőadat-sztringeit a fiókokhoz kapott értékekkel. Például:
// Batch account credentials
private const string BatchAccountName = "yourbatchaccount";
private const string BatchAccountKey = "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==";
private const string BatchAccountUrl = "https://yourbatchaccount.yourbatchregion.batch.azure.com";
// Storage account credentials
private const string StorageAccountName = "yourstorageaccount";
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ójának és verziójának. 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 lehetőséget.
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.
Futtassa a megoldást. 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 monitorozásához lépjen az Azure Portalon a Batch-fiókjába. Ha például meg szeretné jeleníteni a készlete számítási csomópontjainak hőtérképét, kattintson a Készletek>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ókok lehetőségre, majd kattintson a Storage-fiók nevére.
- Kattintson a Blobok>Kimenet 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észeinek elolvasása közben tekintse meg a program.cs fájlt a megoldásban, mivel a minta nem minden kódsorát tárgyalja.
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 a Microsoft Entra-azonosítón keresztüli hitelesítést is támogatja 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);
Ezután 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
: ObjektumgyűjteménytResourceFile
és belső hívásokatUploadResourceFileToContainerAsync
ad vissza a paraméterbeninputFilePaths
átadott összes fájl feltöltéséhez.UploadResourceFileToContainerAsync
: Minden fájlt blobként tölt fel a bemeneti tárolóba. A fájl feltöltése után megkapja a blobhoz tartozó közös hozzáférésű jogosultságkódot (SAS), és visszaad egyResourceFile
objektumot, amely azt jelöli.
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 a készletekben vagy mindkettőt használhatja. A dedikált csomópontok a készlet számára vannak fenntartva. A kihasználatlan csomópontok alacsonyabb á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 kihasználatlan csomópontot tartalmaz Standard_A1_v2 méretben.
Megjegyzés:
Ellenőrizze a csomópontkvótákat. A Kvótakérelmek létrehozásáról a Batch szolgáltatás kvótái és korlátai című témakörben olvashat.
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. Figyelje meg 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-11-08-full_build
haszná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 monitorozása
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);
...
Clean up resources
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.
Következő lépések
Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:
- Adjon hozzá egy alkalmazáscsomagot a Batch-fiókhoz.
- Hitelesítés Batch- és Storage-fiókokkal.
- Bemeneti fájlok feltöltése a Tárolóba.
- Számítási csomópontok készletének létrehozása egy alkalmazás futtatásához.
- Hozzon létre egy feladatot és feladatokat a bemeneti fájlok feldolgozásához.
- Tevékenység végrehajtásának figyelése.
- Kimeneti fájlok lekérése.
A .NET API-val a Batch számítási feladatainak ütemezésére és feldolgozására vonatkozó további példákért tekintse meg a Batch C# mintáit a GitHubon.