Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте пакетную службу Azure, чтобы эффективно выполнять пакетные задания для крупномасштабных параллельных и высокопроизводительных вычислений (HPC). В этом руководстве рассматривается пример C# для запуска параллельной рабочей нагрузки с использованием Azure Batch. Вы изучите общий рабочий процесс приложения пакетной службы и узнаете, как программно взаимодействовать с ресурсами пакетной службы и службы хранилища.
- Добавьте пакет приложения в учетную запись Batch.
- Аутентификация с учетными записями Batch и Storage.
- Отправка входных файлов в хранилище.
- Создайте пул вычислительных узлов для запуска приложения.
- Создайте задание и задачи для обработки входных файлов.
- Мониторинг выполнения задач.
- Получение выходных файлов.
В этом руководстве вы преобразуете файлы мультимедиа MP4 в формат MP3 параллельно с помощью средства ffmpeg с открытым исходным кодом.
Если у вас нет аккаунта Azure, создайте бесплатную учетную запись перед началом.
Предпосылки
Visual Studio 2017 или более поздней версии или пакет SDK для .NET Core для Linux, macOS или Windows.
учетная запись пакетной службы и связанная учетная запись службы хранилища Azure. Чтобы создать эти учетные записи, ознакомьтесь с краткими руководствами по пакетной службе для портал Azure или Azure CLI.
Скачайте соответствующую версию ffmpeg для варианта использования на локальный компьютер. В этом руководстве и соответствующем примере приложения используется полная сборка Windows 64-разрядная версия ffmpeg 4.3.1. Для этого руководства вам нужен только ZIP-файл. Вам не нужно распаковывать или локально устанавливать файл.
Вход в Azure
Войдите на портал Azure.
Добавление пакета приложения
Добавьте ffmpeg в учетную запись Batch в качестве пакета приложений с помощью портала Azure. Пакеты приложений упрощают управление приложениями задач и их развертывание на вычислительных узлах в пуле.
В портале Azure щелкните "Больше служб">"учетные записи Batch" и выберите имя вашей учетной записи Batch.
Выберите Приложения>Добавить.
Введите ffmpeg в поле "Идентификатор приложения" и пакет версии 4.3.1 в поле "Версия ". Выберите скачанный ZIP-файл ffmpeg и нажмите кнопку "Отправить". Пакет приложений ffmpeg добавляется в учетную запись Batch.
Получение учетных данных учетной записи
В этом примере нужно предоставить учетные данные для доступа к учетной записи службы пакетов и учетной записи службы хранилища. Проще всего получить необходимые учетные данные на портале Azure. (Можно также получить эти учетные данные с помощью API-интерфейсов Azure или средств командной строки.)
Выберите Все службы>Пакетные учетные записи и затем выберите имя вашей пакетной учетной записи.
Для просмотра учетных данных пакетной обработки выберите Ключи. Скопируйте значения учетной записи пакетной службы, URL-адреса, и первичного ключа доступа в текстовый редактор.
Чтобы просмотреть имя и ключи учетной записи хранения, выберите Учетная запись хранения. Скопируйте значения имени учетной записи службы хранилища и Key1 в текстовый редактор.
Загрузка и запуск примера приложения
загрузка примера приложения;
Скачайте или клонируйте пример приложения с GitHub. Чтобы клонировать пример репозитория приложения с клиентом Git, выполните следующую команду:
git clone https://github.com/Azure-Samples/batch-dotnet-ffmpeg-tutorial.git
Перейдите в каталог, содержащий файл решения Visual Studio BatchDotNetFfmpegTutorial.sln.
Кроме того, убедитесь, что ссылка на пакет ffmpeg в вашем решении совпадает с идентификатором и версией пакета ffmpeg, который вы загрузили в свою учетную запись Batch. Например, ffmpeg и 4.3.1.
const string appPackageId = "ffmpeg";
const string appPackageVersion = "4.3.1";
Создание и запуск примера проекта
Создавайте и запускайте приложения в Visual Studio или с помощью команд dotnet build и dotnet run в командной строке. После запуска приложения просмотрите код, чтобы узнать, как работает каждый компонент приложения. Например, в Visual Studio:
В обозревателе решений щелкните решение правой кнопкой мыши и выберите пункт Собрать решение.
Подтвердите восстановление пакетов NuGet, если появится соответствующий запрос. Если вам необходимо скачать отсутствующие пакеты, установите диспетчер пакетов NuGet.
Запустите решение. Когда вы запускаете образец приложения, вывод в консоли будет примерно следующим. Во время выполнения вы испытываете паузу на этапе
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
Перейдите в учетную запись Batch на портале Azure, чтобы контролировать пул, вычислительные узлы, задания и задачи. Например, чтобы увидеть тепловую карту вычислительных узлов в вашем пуле, выберите Пулы>WinFFmpegPool.
Во время выполнения задач тепловая карта выглядит следующим образом:
Обычное время выполнения — примерно 10 минут, если для приложения задана конфигурация по умолчанию. Для создания пула потребуется больше всего времени.
Извлечение выходных файлов
Портал Azure можно использовать для скачивания выходных MP3-файлов, созданных задачами ffmpeg.
- Выберите Все службы>Учетные записи службы хранилища и щелкните имя учетной записи службы хранилища.
- Щелкните Blobs>вывод.
- Щелкните правой кнопкой мыши один из выходных MP3-файлов и нажмите кнопку Загрузить. Следуйте инструкциям в браузере, чтобы открыть или сохранить этот файл.
Хотя это не показано в этом примере, файлы можно также скачать программным способом из вычислительных узлов или контейнера хранилищ.
Просмотр кода
В следующих разделах мы разобьем пример приложения на действия, выполняемые для обработки рабочей нагрузки в пакетной службе. Обратитесь к файлу , Program.cs в решении при чтении остальной части этой статьи, так как в примере рассматривается не каждая строка кода.
Аутентификация Blob и Batch клиентов
Для взаимодействия с связанной учетной записью хранения приложение использует библиотеку Azure.Storage.Blobs для .NET. Использование класса BlobServiceClient, который принимает URI учетной записи и токен аутентификации, например, 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());
Приложение создает ссылку на BatchAccountResource через ArmClient диспетчера ресурсов для создания пула в службе Batch. Клиент Arm в примере использует аутентификацию с использованием DefaultAzureCredential.
ArmClient _armClient = new ArmClient(new DefaultAzureCredential());
var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();
Приложение создает объект BatchClient для создания заданий и задач в службе пакетной обработки. Клиент пакетной службы в этом примере использует аутентификацию 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());
Передача входных файлов
Приложение передает объект blobServerClient методу CreateContainerIfNotExist, чтобы создать контейнер для хранения входных файлов (формат MP4) и контейнер для выходных данных задач.
CreateContainerIfNotExist(blobClient, inputContainerName);
CreateContainerIfNotExist(blobClient, outputContainerName);
Затем файлы отправляются в входной контейнер из локальной папки InputFiles . Файлы в хранилище определяются как объекты Batch ResourceFile, которые Batch может впоследствии скачать на вычислительные узлы.
Два метода в Program.cs участвуют в отправке файлов:
-
UploadFilesToContainerAsync: возвращает коллекцию объектовResourceFileи внутренне вызываетUploadResourceFileToContainerAsync, чтобы загрузить каждый файл, передаваемый в параметрinputFilePaths. -
UploadResourceFileToContainerAsync. Загружает каждый файл как BLOB в входной контейнер. После отправки файла он получает подписанную строку доступа (SAS) для блоба и возвращает объектResourceFileдля его представления.
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);
Подробнее о загрузке файлов в качестве больших двоичных объектов в учетную запись хранения с .NET см. в статье об отправке, скачивании и перечислении больших двоичных объектов с помощью .NET.
Создание пула вычислительных узлов
Затем в учетной записи пакетной службы создается пул вычислительных узлов с помощью вызова CreatePoolIfNotExistAsync. Этот определенный метод использует BatchAccountResource.GetBatchAccountPools(). Метод CreateOrUpdateAsync позволяет задать количество узлов, размер виртуальной машины и конфигурацию пула. Здесь объект BatchVmConfiguration задает BatchImageReference на образ Windows Server, опубликованный в Azure Marketplace. Служба Azure Batch поддерживает широкий спектр образов ВМ в торговой площадке Azure Marketplace и пользовательских образов ВМ.
Количество узлов и размер виртуальной машины настраиваются с помощью определенных констант. Пакетная служба Azure поддерживает выделенные узлы и точечные узлы, и вы можете использовать любые из них или оба в своих пулах. Выделенные узлы зарезервированы для пула. Точечные узлы предлагаются по сниженной цене с учетом избыточных ресурсов виртуальной машины в Azure. Эти узлы становятся недоступны, если в Azure недостаточно ресурсов. Пример по умолчанию создает пул, содержащий только 5 точечных узлов размером Standard_A1_v2.
Примечание.
Убедитесь, что вы проверяете квоты узла. Инструкции по созданию запроса на квоту см. в разделе Квоты и ограничения пакетной службы.
Приложение ffmpeg развертывается на вычислительных узлах, добавляя ApplicationPackageReference к конфигурации пула.
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;
Создание задания
Пакетное задание указывает пул для запуска задач и дополнительные параметры, такие как приоритет и расписание работы. Пример создает задание путем вызова CreateJobAsync. Этот предопределенный метод использует BatchClient.CreateJobAsync для создания задания в вашем пуле.
BatchJobCreateContent batchJobCreateContent = new BatchJobCreateContent(jobId, new BatchPoolInfo { PoolId = poolId });
await batchClient.CreateJobAsync(batchJobCreateContent);
Создание задач
В примере создаются задачи в задании с вызовом AddTasksAsync метода, который создает список объектов BatchTask . Каждый BatchTask запускает ffmpeg для обработки объекта входных данных ResourceFile с помощью свойства CommandLine. ffmpeg был ранее установлен на каждом узле при создании пула. В командной строке выполняется ffmpeg для преобразования каждого входного файла MP4 (видео) в файл MP3 (аудио).
В примере создается объект OutputFile для файла MP3 после запуска командной строки. Выходные файлы каждой задачи (в этом случае один) передаются в контейнер в связанной учетной записи с помощью свойства задачи OutputFiles. Обратите внимание на набор условий в объекте outputFile. Выходной файл из задачи передается в контейнер только после успешного завершения задачи (OutputFileUploadCondition.TaskSuccess). Ознакомьтесь с полным примером кода на сайте GitHub для получения дальнейших сведений о реализации.
Затем пример добавляет задачи в задание методом CreateTaskAsync , который помещает их в очередь для выполнения на вычислительных узлах.
Замените путь к исполняемому файлу именем загруженной версии. В этом коде используется пример 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));
Очистка ресурсов
После выполнения задач приложение автоматически удаляет контейнер входного хранилища, который оно создало, а также предоставляет возможность удалить пул и задания Batch. BatchClient имеет метод удаления задания DeleteJobAsync и удаления пула DeletePoolAsync, который вызывается при подтверждении удаления. Вы не оплачиваете задания и задачи, но платите за используемые вычислительные узлы. Поэтому рекомендуется выделять пулы только при необходимости. При удалении пула удаляются все выходные данные задачи в узлах. Но выходные файлы сохраняются в учетной записи хранения.
Ставшие ненужными группу ресурсов, учетную запись пакетной службы и учетную запись хранения можно удалить. Для этого на портале Azure выберите группу ресурсов для учетной записи пакетной службы и щелкните Удалить группу ресурсов.
Следующие шаги
Из этого руководства вы узнали, как:
- Добавьте пакет приложения в учетную запись Batch.
- Аутентификация с учетными записями Batch и Storage.
- Отправка входных файлов в хранилище.
- Создайте пул вычислительных узлов для запуска приложения.
- Создайте задание и задачи для обработки входных файлов.
- Мониторинг выполнения задач.
- Получение выходных файлов.
Дополнительные примеры использования API .NET для планирования и обработки рабочих нагрузок пакетной службы см. в примерах пакетной службы C# на GitHub.