Руководство. Запуск параллельной рабочей нагрузки с помощью пакета Azure с использованием .NET API
Используйте пакетную службу Azure, чтобы эффективно выполнять пакетные задания для крупномасштабных параллельных и высокопроизводительных вычислений (HPC). В этом руководстве рассматривается пример C# для запуска параллельной рабочей нагрузки с помощью пакетной службы Azure. Вы изучите общий рабочий процесс приложения пакетной службы и узнаете, как программно взаимодействовать с ресурсами пакетной службы и службы хранилища.
- Добавьте пакет приложения в учетную запись пакетной службы.
- Проверка подлинности с помощью учетных записей пакетной службы и хранения.
- Отправка входных файлов в хранилище.
- Создайте пул вычислительных узлов для запуска приложения.
- Создайте задание и задачи для обработки входных файлов.
- Мониторинг выполнения задач.
- Получение выходных файлов.
В этом руководстве вы преобразуете файлы мультимедиа MP4 в формат MP3 параллельно с помощью средства ffmpeg с открытым исходным кодом.
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись 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 в учетную запись пакетной службы в качестве пакета приложений с помощью портала Azure. Пакеты приложений упрощают управление приложениями задач и их развертывание на вычислительных узлах в пуле.
В портал Azure щелкните "Другие учетные>записи пакетной службы" и выберите имя учетной записи пакетной службы.
Выберите Приложения>Добавить.
Введите ffmpeg в поле "Идентификатор приложения" и пакет версии 4.3.1 в поле "Версия ". Выберите скачанный ZIP-файл ffmpeg и нажмите кнопку "Отправить". Пакет приложений ffmpeg добавляется в учетную запись пакетной службы.
Получение учетных данных учетной записи
В этом примере нужно предоставить учетные данные для доступа к учетной записи службы хранилища и пакетной службы. Проще всего получить необходимые учетные данные на портале 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, который вы отправили в свою учетную запись. Например, 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
Перейдите в учетную запись пакетной службы на портале Azure, чтобы отследить пул, вычислительные узлы, задания и задачи. Например, чтобы увидеть тепловую карту вычислительных узлов в вашем пуле, выберите Пулы>WinFFmpegPool.
Во время выполнения задач тепловая карта выглядит следующим образом:
Обычное время выполнения — примерно 10 минут, если для приложения задана конфигурация по умолчанию. Для создания пула потребуется больше всего времени.
Извлечение выходных файлов
Портал Azure можно использовать для скачивания выходных MP3-файлов, созданных задачами ffmpeg.
- Выберите Все службы>Учетные записи службы хранилища и щелкните имя учетной записи службы хранилища.
- Щелкните Большие двоичные объекты>Вывод.
- Щелкните правой кнопкой мыши один из выходных MP3-файлов и нажмите кнопку Загрузить. Следуйте инструкциям в браузере, чтобы открыть или сохранить этот файл.
Хотя это не показано в этом примере, файлы можно также скачать программным способом из вычислительных узлов или контейнера хранилищ.
Просмотр кода
В следующих разделах мы разобьем пример приложения на действия, выполняемые для обработки рабочей нагрузки в пакетной службе. Обратитесь к файлу , Program.cs в решении при чтении остальной части этой статьи, так как в примере рассматривается не каждая строка кода.
Проверка подлинности клиентов больших двоичных объектов и пакетной службы
Для взаимодействия с связанной учетной записью хранения приложение использует библиотеку 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 диспетчера ресурсов для создания пула в пакетной службе. Клиент 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 . Файлы в хранилище определяются как объекты пакетной службы ResourceFile, которые она может впоследствии скачать на вычислительные узлы.
Два метода в Program.cs участвуют в отправке файлов:
UploadFilesToContainerAsync
: возвращает коллекцию объектов и внутренние вызовыUploadResourceFileToContainerAsync
для отправкиResourceFile
каждого файла, передаваемого в параметреinputFilePaths
.UploadResourceFileToContainerAsync
. Загружает каждый файл в качестве большого двоичного объекта в контейнер входных данных. После отправки файла он получает подписанный URL-адрес (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 поддерживает широкий спектр образов виртуальной машины в 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));
Очистка ресурсов
После выполнения задач приложение автоматически удаляет созданный входной контейнер хранилища, а также предоставляет возможность удалить пул и задания пакетной службы. BatchClient имеет метод удаления задания DeleteJobAsync и удаления пула DeletePoolAsync, который вызывается при подтверждении удаления. Вы не оплачиваете задания и задачи, но платите за используемые вычислительные узлы. Поэтому рекомендуется выделять пулы только при необходимости. При удалении пула удаляются все выходные данные задачи на узлах. Но выходные файлы сохраняются в учетной записи хранения.
Ставшие ненужными группу ресурсов, учетную запись пакетной службы и учетную запись хранения можно удалить. Для этого на портале Azure выберите группу ресурсов для учетной записи пакетной службы и щелкните Удалить группу ресурсов.
Следующие шаги
Из этого руководства вы узнали, как:
- Добавьте пакет приложения в учетную запись пакетной службы.
- Проверка подлинности с помощью учетных записей пакетной службы и хранения.
- Отправка входных файлов в хранилище.
- Создайте пул вычислительных узлов для запуска приложения.
- Создайте задание и задачи для обработки входных файлов.
- Мониторинг выполнения задач.
- Получение выходных файлов.
Дополнительные примеры использования API .NET для планирования и обработки рабочих нагрузок пакетной службы см. в примерах пакетной службы C# на GitHub.