Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Usługa Azure Batch umożliwia wydajne uruchamianie zadań wsadowych obliczeń równoległych i obliczeń o wysokiej wydajności (HPC, large-scale parallel and high-performance computing) na platformie Azure. W tym samouczku przedstawiono przykładowe uruchamianie równoległego obciążenia przy użyciu usługi Batch w języku C#. Poznasz powszechny przepływ pracy aplikacji Batch oraz jak współpracować programistycznie z zasobami Batch i Storage.
- Dodaj pakiet aplikacji do konta usługi Batch.
- Uwierzytelnij się za pomocą kont Batch i Storage.
- Przekazywanie plików wejściowych do usługi Storage.
- Utwórz pulę węzłów obliczeniowych, aby uruchomić aplikację.
- Utwórz zadanie oraz zadania do przetwarzania plików wejściowych.
- Monitorowanie wykonywania zadań.
- Pobieranie plików wyjściowych.
W tym samouczku przekonwertujesz pliki multimedialne MP4 na format MP3, równolegle przy użyciu narzędzia open source ffmpeg .
Jeśli nie masz jeszcze konta platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
Wymagania wstępne
Program Visual Studio 2017 lub nowszy albo zestaw .NET Core SDK dla systemów Linux, macOS lub Windows.
Konto usługi Batch i połączone konto usługi Azure Storage. Aby utworzyć te konta, zapoznaj się z przewodnikami szybkiego startu dotyczącymi usługi Batch w portalu Azure lub interfejsie Azure CLI.
Pobierz odpowiednią wersję narzędzia ffmpeg dla twojego przypadku użycia na komputerze lokalnym. W tym samouczku i powiązanej przykładowej aplikacji użyto wersji pełnej kompilacji systemu Windows w wersji 64-bitowej ffmpeg 4.3.1. Na potrzeby tego samouczka potrzebny jest tylko plik zip. Nie trzeba rozpakuć pliku ani instalować go lokalnie.
Zaloguj się do Azure
Zaloguj się do witryny Azure Portal.
Dodawanie pakietu aplikacji
Użyj witryny Azure Portal, aby dodać aplikację ffmpeg do konta usługi Batch jako pakiet aplikacji. Pakiety aplikacji pomagają zarządzać aplikacjami zadań i ich wdrażaniem na komputerowych węzłach obliczeniowych w twojej puli.
W witrynie Azure Portal kliknij pozycję Więcej usług>Usługi Batch i wybierz nazwę konta usługi Batch.
Kliknij pozycję Aplikacje>Dodaj.
Wprowadź ffmpeg w polu Identyfikator aplikacji i wersję pakietu 4.3.1 w polu Wersja. Wybierz pobrany plik zip ffmpeg, a następnie wybierz pozycję Prześlij. Pakiet aplikacji ffmpeg został dodany do Twojego konta Batch.
Uzyskiwanie poświadczeń konta
W tym przykładzie należy podać poświadczenia dla kont usług Batch i Storage. Najprościej jest uzyskać wymagane poświadczenia w witrynie Azure Portal. (Te poświadczenia możesz również uzyskać za pomocą interfejsów API platformy Azure lub narzędzi wiersza polecenia).
Wybierz opcję Wszystkie usługi>Konta usługi Batch, a następnie wybierz nazwę swojego konta Batch.
Aby wyświetlić poświadczenia usługi Batch, wybierz pozycję Klucze. Skopiuj wartości z pól Konto usługi Batch, Adres URL i Podstawowy klucz dostępu do edytora tekstów.
Aby wyświetlić nazwę i klucze konta pamięci masowej, wybierz pozycję Konto pamięci masowej. Skopiuj wartości z pól Nazwa konta usługi Storage i Klucz1 do edytora tekstów.
Pobieranie i uruchamianie przykładowej aplikacji
Pobieranie przykładowej aplikacji
Pobierz lub sklonuj przykładową aplikację z usługi GitHub. Aby sklonować repozytorium przykładowej aplikacji za pomocą klienta Git, użyj następującego polecenia:
git clone https://github.com/Azure-Samples/batch-dotnet-ffmpeg-tutorial.git
Przejdź do katalogu zawierającego plik rozwiązania programu Visual Studio BatchDotNetFfmpegTutorial.sln.
Upewnij się również, że odwołanie do pakietu aplikacji ffmpeg w rozwiązaniu jest zgodne z identyfikatorem i wersją pakietu ffmpeg przekazanego do konta usługi Batch. Przykład: ffmpeg
i 4.3.1
.
const string appPackageId = "ffmpeg";
const string appPackageVersion = "4.3.1";
Kompilowanie i uruchamianie przykładowego projektu
Skompiluj i uruchom aplikację w programie Visual Studio lub z wiersza polecenia za pomocą poleceń dotnet build
i dotnet run
. Po uruchomieniu aplikacji przejrzyj kod, aby dowiedzieć się, co robi każda część aplikacji. Na przykład w programie Visual Studio:
Kliknij prawym przyciskiem myszy rozwiązanie w Eksploratorze rozwiązań i wybierz pozycję Kompiluj rozwiązanie.
Potwierdź przywrócenie dowolnych pakietów NuGet, jeśli zostanie wyświetlony monit. Jeśli musisz pobrać brakujące pakiety, upewnij się, że jest zainstalowany Menedżer pakietów NuGet .
Uruchom rozwiązanie. Po uruchomieniu aplikacji przykładowej dane wyjściowe w konsoli będą wyglądać mniej więcej następująco. W czasie wykonywania nastąpi wstrzymanie operacji w momencie wyświetlenia komunikatu
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
podczas uruchamiania węzłów obliczeniowych puli.
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
Przejdź do konta usługi Batch w witrynie Azure Portal, aby monitorować pulę, węzły obliczeniowe, zadanie i zadania podrzędne. Aby na przykład wyświetlić mapę cieplną węzłów obliczeniowych w puli, kliknij opcję Pule>WinFFmpegPool.
Podczas wykonywania zadań mapa cieplna wygląda następująco:
Typowy czas wykonywania wynosi około 10 minut , gdy uruchamiasz aplikację w konfiguracji domyślnej. Tworzenie puli zajmuje najwięcej czasu.
Pobieranie plików wyjściowych
Przy użyciu witryny Azure Portal można pobrać wyjściowe pliki MP3 wygenerowane przez zadania ffmpeg.
- Kliknij Wszystkie usługi>Konta magazynu i kliknij nazwę swojego konta magazynu.
- Kliknij Blob>wyjście.
- Kliknij prawym przyciskiem myszy jeden z wyjściowych plików MP3, a następnie kliknij polecenie Pobierz. Postępuj zgodnie z monitami wyświetlanymi w przeglądarce, aby otworzyć lub zapisać plik.
Mimo że nie pokazano tego w tym przykładzie, pliki można również pobrać programowo z węzłów obliczeniowych lub z kontenera magazynu.
Przeglądanie kodu
W poniższych sekcjach przykładowa aplikacja jest rozłożona na kroki dotyczące przetwarzania obciążenia w usłudze Batch. Zapoznaj się z plikiem Program.cs w rozwiązaniu podczas czytania pozostałej części tego artykułu, ponieważ nie omówiono każdego wiersza kodu w przykładzie.
Uwierzytelnianie klientów obiektów Blob i klientów Batch
Aby korzystać z połączonego konta magazynu, aplikacja używa biblioteki Azure.Storage.Blobs dla platformy .NET. Korzystając z klasy BlobServiceClient , która przyjmuje odwołanie do identyfikatora URI konta i uwierzytelniania tokenu , takiego jak 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());
Aplikacja tworzy odwołanie do zasobu BatchAccountResource za pośrednictwem ArmClient menedżera zasobów, aby utworzyć pulę w usłudze Batch. Klient ARM używa w przykładzie uwierzytelniania DefaultAzureCredential.
ArmClient _armClient = new ArmClient(new DefaultAzureCredential());
var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();
Aplikacja tworzy obiekt BatchClient, aby tworzyć zlecenia i zadania w usłudze Batch. Klient usługi Batch w przykładzie używa uwierzytelniania 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());
Przekazywanie plików wejściowych
Aplikacja przekazuje blobServerClient
obiekt do CreateContainerIfNotExist
metody w celu utworzenia kontenera do przechowywania plików wejściowych (w formacie MP4) oraz kontenera do przechowywania danych wyjściowych zadania.
CreateContainerIfNotExist(blobClient, inputContainerName);
CreateContainerIfNotExist(blobClient, outputContainerName);
Następnie pliki są przekazywane do kontenera wejściowego z lokalnego folderu InputFiles . Pliki w magazynie są definiowane jako obiekty ResourceFile usługi Batch, które następnie mogą być pobierane przez tę usługę do węzłów obliczeniowych.
Dwie metody w Program.cs są związane z przekazywaniem plików:
-
UploadFilesToContainerAsync
: zwraca kolekcję obiektówResourceFile
i wewnętrznie wywołujeUploadResourceFileToContainerAsync
, aby przesłać każdy plik przekazany w parametrzeinputFilePaths
. -
UploadResourceFileToContainerAsync
: przesyła każdy plik jako obiekt typu blob do kontenera wejściowego. Po przekazaniu pliku uzyskuje sygnaturę dostępu współdzielonego (SAS) dla bloba i zwraca obiektResourceFile
, który go reprezentuje.
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);
Aby uzyskać szczegółowe informacje na temat przekazywania plików jako obiektów blob na konto magazynowe Azure za pomocą platformy .NET, zobacz Przekazywanie, pobieranie i wyświetlanie listy obiektów blob przy użyciu .NET.
Tworzenie puli węzłów obliczeniowych
Następnie w przykładzie tworzona jest pula węzłów obliczeniowych na koncie usługi Batch z wywołaniem funkcji CreatePoolIfNotExistAsync
. Ta zdefiniowana metoda używa BatchAccountResource.GetBatchAccountPools().CreateOrUpdateAsync do ustawienia liczby węzłów, rozmiaru maszyny wirtualnej i konfiguracji puli. W tym miejscu obiekt BatchVmConfiguration określa właściwość BatchImageReference do obrazu systemu Windows Server opublikowanego w witrynie Azure Marketplace. Usługa Batch obsługuje szeroki zakres obrazów maszyn wirtualnych z witryny Azure Marketplace oraz niestandardowe obrazy maszyn wirtualnych.
Liczba węzłów i rozmiar maszyny wirtualnej są ustawiane przy użyciu zdefiniowanych stałych. Usługa Batch obsługuje dedykowane węzły i węzły typu spot, a w pulach można używać obu tych węzłów. Dla Twojej puli są zarezerwowane węzły dedykowane. Węzły typu spot są oferowane w obniżonej cenie z nadwyżkowej pojemności maszyn wirtualnych na platformie Azure. Węzły typu spot stają się niedostępne, jeśli platforma Azure nie ma wystarczającej pojemności. Przykład domyślnie tworzy pulę zawierającą tylko 5 węzłów typu spot o rozmiarze Standard_A1_v2.
Uwaga / Notatka
Upewnij się, że sprawdzasz swoje przydziały węzłów. Aby uzyskać instrukcje dotyczące tworzenia żądania przydziału, zobacz Limity i przydziały usługi Batch.
Aplikacja ffmpeg jest wdrażana w węzłach obliczeniowych przez dodanie elementu ApplicationPackageReference do konfiguracji puli.
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;
Utwórz pracę
Zadanie usługi Batch określa pulę do uruchamiania zadań oraz opcjonalne ustawienia, takie jak priorytet i harmonogram pracy. Przykładowa aplikacja tworzy zadanie z wywołaniem CreateJobAsync
. Ta zdefiniowana metoda używa metody BatchClient.CreateJobAsync do utworzenia zadania w puli.
BatchJobCreateContent batchJobCreateContent = new BatchJobCreateContent(jobId, new BatchPoolInfo { PoolId = poolId });
await batchClient.CreateJobAsync(batchJobCreateContent);
Tworzenie zadań
Przykład tworzy zadania w pracy poprzez wywołanie metody AddTasksAsync
, która tworzy listę obiektów BatchTask. Każdy BatchTask
z nich uruchamia narzędzie ffmpeg w celu przetworzenia obiektu wejściowego ResourceFile
przy użyciu właściwości CommandLine . Narzędzie ffmpeg było już zainstalowane na wszystkich węzłach podczas tworzenia puli. Tutaj wiersz polecenia jest używany do uruchomienia narzędzia ffmpeg w celu przekonwertowania każdego z plików wejściowych w formacie MP4 (wideo) na format MP3 (audio).
Przykładowa aplikacja tworzy obiekt OutputFile dla pliku MP3 po uruchomieniu wiersza polecenia. Pliki wyjściowe każdego zadania (w tym przypadku jeden) są przekazywane do kontenera na połączonym koncie magazynu przy użyciu właściwości OutputFiles zadania. Zanotuj warunki ustawione na outputFile
obiekcie. Plik wyjściowy z zadania jest przekazywany tylko do kontenera po pomyślnym ukończeniu zadania (OutputFileUploadCondition.TaskSuccess
). Aby uzyskać więcej szczegółów implementacji, zobacz pełny przykład kodu w witrynie GitHub.
Następnie przykład dodaje zadania do projektu za pomocą metody CreateTaskAsync, która kolejkuje je do uruchomienia na węzłach obliczeniowych.
Zastąp ścieżkę pliku pliku wykonywalnego nazwą pobranej wersji. W tym przykładowym kodzie użyto przykładu 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));
Uprzątnij zasoby
Po wykonaniu zadań aplikacja automatycznie usuwa utworzony wejściowy kontener magazynu. Daje również możliwość usunięcia puli Batch i zadania. Klasa BatchClient ma metodę usuwania zadania DeleteJobAsync i usuwania puli DeletePoolAsync, które są wywoływane w przypadku potwierdzenia usunięcia. Mimo że nie są naliczane opłaty za same zadania i zadania podrzędne, są naliczane opłaty za węzły obliczeniowe. W związku z tym zaleca się przydzielanie pul stosownie do potrzeb. Gdy usuniesz pulę, wszystkie dane wyjściowe zadań na węzłach zostaną usunięte. Jednak pliki wyjściowe pozostają na koncie magazynowym.
Gdy grupa zasobów, konto usługi Batch i konto magazynu nie będą już potrzebne, usuń je. Aby to zrobić w witrynie Azure Portal, wybierz grupę zasobów dla konta usługi Batch i kliknij pozycję Usuń grupę zasobów.
Dalsze kroki
W tym samouczku nauczyłeś się następujących rzeczy:
- Dodaj pakiet aplikacji do konta usługi Batch.
- Uwierzytelnij się za pomocą kont Batch i Storage.
- Przekazywanie plików wejściowych do usługi Storage.
- Utwórz pulę węzłów obliczeniowych, aby uruchomić aplikację.
- Utwórz zadanie oraz zadania do przetwarzania plików wejściowych.
- Monitorowanie wykonywania zadań.
- Pobieranie plików wyjściowych.
Aby uzyskać więcej przykładów użycia interfejsu API platformy .NET do planowania i przetwarzania obciążeń usługi Batch, zobacz przykłady języka C# usługi Batch w witrynie GitHub.