Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Задача, выполняемая в пакетной службе Azure, может создавать выходные данные при выполнении. Выводимые данные задачи часто необходимо хранить, чтобы другие задачи в ходе выполнения задания или клиентское приложение, выполняющее задание, могли их получить. Задачи записывают выходные данные в файловую систему вычислительного узла пакетной службы, но все данные на узле теряются при повторном переимысле или при выходе узла из пула. Задачи также могут иметь период хранения файлов, после которого удаляются файлы, созданные задачей. По этим причинам важно сохранить выходные данные задачи, которые потребуется позже в хранилище данных, например в службе хранилища Azure.
Параметры учетной записи хранения в пакетной службе см. в разделе "Учетные записи пакетной службы" и учетные записи хранения Azure.
API пакетной службы поддерживает сохранение выходных данных в службе хранилища Azure для задач и задач диспетчера заданий, выполняемых в пулах с конфигурацией виртуальной машины. При добавлении задачи можно указать контейнер в службе хранилища Azure в качестве назначения для выходных данных задачи. Затем пакетная служба записывает выходные данные в этот контейнер после завершения задачи.
При использовании API службы пакетной обработки для сохранения выходных данных задачи не требуется изменять приложение, в котором выполняется задача. Вместо этого с несколькими изменениями клиентского приложения можно сохранить выходные данные задачи в том же коде, который создает задачу.
Это важно
Сохранение данных задачи в служба хранилища Azure с помощью API службы Batch не работает с пулами, созданными до 1 февраля 2018 г.
Когда я должен использовать API пакетной службы для постоянного сохранения выходных данных задачи?
Пакетная служба Azure предоставляет несколько способов сохранения выходных данных задачи. Использование API пакетной службы — это удобный подход, который лучше всего подходит для следующих сценариев:
- Вы хотите написать код для сохранения выходных данных задачи из клиентского приложения, не изменяя приложение, которое выполняется вашей задачей.
- Вы хотите сохранить выходные данные из задач пакетной службы и задач диспетчера заданий в пулах, созданных с конфигурацией виртуальной машины.
- Вы хотите сохранить выходные данные в контейнере службы хранилища Azure с произвольным именем.
- Вы хотите сохранить выходные данные в контейнере хранилища Azure, название которого соответствует стандарту пакетных файлов.
Если сценарий отличается от перечисленных выше, может потребоваться рассмотреть другой подход. Например, API пакетной службы в настоящее время не поддерживает потоковую передачу выходных данных в службу хранилища Azure во время выполнения задачи. Для потоковой передачи выходных данных рекомендуется использовать библиотеку соглашений о пакетных файлах, доступную для .NET. Для других языков необходимо реализовать собственное решение. Дополнительные сведения о других параметрах см. в статье «Сохранение выходных данных заданий и задач в служба хранилища Azure».
Создание контейнера в службе хранилища Azure
Чтобы сохранить выходные данные задачи в службе хранилища Azure, необходимо создать контейнер, который служит местом назначения для выходных файлов. Создайте контейнер перед выполнением задачи, желательно перед отправкой задания с помощью соответствующей клиентской библиотеки службы хранилища Azure или пакета SDK. Дополнительные сведения об API службы хранилища Azure см. в документации по службе хранилища Azure.
Например, если вы пишете приложение в C#, используйте клиентская библиотека службы хранилища Azure для .NET. В следующем примере показано, как создать контейнер.
BlobContainerClient container = storageAccount.GetBlobContainerClient(containerName);
await container.CreateIfNotExistsAsync();
Укажите файлы для выходных данных задачи
Чтобы указать выходные файлы для задачи, создайте коллекцию объектов OutputFile и назначьте его свойству BatchTaskCreateOptions.OutputFiles при создании задачи. Вы можете использовать Общую подписанную подпись (SAS) или управляемое удостоверение для проверки подлинности доступа к контейнеру.
Использование общей подписи доступа
После создания контейнера получите подписанный URL-адрес (SAS) с доступом на запись к контейнеру. SAS предоставляет делегированный доступ к контейнеру. SAS предоставляет доступ с указанным набором разрешений и через указанный интервал времени. Пакетной службе требуется SAS с разрешениями на запись выходных данных задачи в контейнер. Дополнительные сведения о SAS см. в статье Об использовании подписанных URL-адресов (SAS) в службе хранилища Azure.
При получении SAS с помощью API службы хранилища Azure возвращается токен SAS. Эта строка маркера включает все параметры SAS, включая разрешения и интервал, в течение которого SAS действителен. Чтобы использовать SAS для доступа к контейнеру в службе хранилища Azure, необходимо добавить строку маркера SAS в URI ресурса. URI ресурса вместе с добавленным маркером SAS предоставляет прошедший проверку подлинности доступ к службе хранилища Azure.
В следующем примере показано, как получить строку маркера SAS только для записи для контейнера, а затем добавить SAS в URI контейнера:
BlobSasBuilder sasBuilder = new BlobSasBuilder(BlobContainerSasPermissions.Write, DateTimeOffset.UtcNow.AddDays(1))
{
BlobContainerName = container.Name,
Resource = "c"
};
Uri containerSasUrl = container.GenerateSasUri(sasBuilder);
В следующем примере кода C# создается задача, которая записывает случайные числа в файл с именем output.txt. Пример создает выходной файл для записи output.txt в этот контейнер. В примере также создаются выходные файлы для всех файлов журнала, которые соответствуют шаблону std*.txt файла (например, stdout.txt и stderr.txt). Для URL-адреса контейнера требуется ранее созданный SAS для этого контейнера. Пакетная служба использует SAS для проверки подлинности доступа к контейнеру.
BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId,
"cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles =
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination()
{
Container = new OutputFileBlobContainerDestination(containerSasUri) { Path = taskId }
},
uploadOptions: new OutputFileUploadConfig(OutputFileUploadCondition.TaskCompletion)),
new OutputFile(
filePattern: @"output.txt",
destination: new OutputFileDestination()
{
Container = new OutputFileBlobContainerDestination(containerSasUri) { Path = taskId + @"\output.txt" }
},
uploadOptions: new OutputFileUploadConfig(OutputFileUploadCondition.TaskCompletion)),
}
};
Примечание.
При использовании этого примера с Linux обязательно смените обратные слэши на прямые.
Использование управляемого удостоверения
Вместо создания и передачи ключа SAS с доступом на запись к контейнеру в Azure Batch, можно использовать управляемое удостоверение для аутентификации в службе служба хранилища Azure. Удостоверение должно быть назначено пулу пакетной службы, а также иметь Storage Blob Data Contributor назначение роли для контейнера, в который будет производиться запись. Затем можно указать службе Batch использовать управляемое удостоверение вместо SAS для проверки подлинности доступа к контейнеру.
BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId,
"cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles =
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination()
{
Container = new OutputFileBlobContainerDestination(containerUri)
{
Path = taskId,
IdentityReference = new BatchNodeIdentityReference()
{
ResourceId = new ResourceIdentifier(identityResourceId)
}
}
},
uploadOptions: new OutputFileUploadConfig(OutputFileUploadCondition.TaskCompletion)),
}
};
Указание шаблона файла для сопоставления
При указании выходного файла можно использовать свойство OutputFile.FilePattern , чтобы указать шаблон файла для сопоставления. Шаблон файла может совпадать с нулевыми файлами, одним файлом или набором файлов, созданных задачей.
Свойство FilePattern поддерживает стандартные подстановочные знаки файловой системы, такие как * (для не рекурсивных совпадений) и ** (для рекурсивных совпадений). Например, приведенный выше пример кода указывает шаблон файла, соответствующий std*.txt не рекурсивно:
filePattern: @"..\std*.txt"
Чтобы отправить один файл, укажите шаблон файла без подстановочных знаков. Например, приведенный выше пример кода указывает шаблон файла, соответствующий output.txt:
filePattern: @"output.txt"
Указание условия отправки
Свойство OutputFileUploadConfig.UploadCondition позволяет условно отправлять выходные файлы. Распространенный сценарий заключается в отправке одного набора файлов, если задача выполнена успешно, и другой набор файлов, если он завершается ошибкой. Например, вы можете отправлять подробные файлы журналов только в том случае, если задача завершается сбоем и с ненулевым кодом выхода. Аналогичным образом может потребоваться отправить файлы результатов только в том случае, если задача выполнена успешно, так как эти файлы могут быть отсутствуют или неполны, если задача завершается ошибкой.
Приведенный выше пример кода задает свойству UploadCondition значение TaskCompletion. Этот параметр указывает, что файл должен быть отправлен после завершения задач независимо от значения кода выхода.
uploadCondition: OutputFileUploadCondition.TaskCompletion
Сведения о других параметрах см. в перечислении OutputFileUploadCondition .
Диамбигуатные файлы с тем же именем
Задачи в задании могут создавать файлы с одинаковым именем. Например, stdout.txt и stderr.txt создаются для каждой задачи, которая выполняется в задании. Так как каждая задача выполняется в собственном контексте, эти файлы не конфликтуют в файловой системе узла. Однако при загрузке файлов из нескольких задач в общий контейнер вам потребуется различать файлы с одинаковым именем.
Свойство OutputFileBlobContainerDestination.Path указывает на целевой BLOB или виртуальный каталог для выходных файлов. Свойство Path можно использовать для задания имени блоба или виртуального каталога таким образом, чтобы выходным файлам с одинаковыми именами были присвоены уникальные имена в хранилище Azure. Использование идентификатора задачи в пути — это хороший способ обеспечить уникальные имена и легко идентифицировать файлы.
Если для свойства FilePattern задано подстановочное выражение, все файлы, соответствующие шаблону, отправляются в виртуальный каталог, указанный свойством Path . Например, если контейнер — mycontainer, идентификатор задачи — mytask, а шаблон файла — ..\std*.txt, то абсолютные URI выходных файлов в службе хранилища Azure будут похожи на следующие:
https://myaccount.blob.core.windows.net/mycontainer/mytask/stderr.txt
https://myaccount.blob.core.windows.net/mycontainer/mytask/stdout.txt
Если свойство FilePattern соответствует одному имени файла, то есть не содержит подстановочных знаков, то значение свойства Path указывает полное имя большого двоичного объекта. Если предполагается, что именование конфликтует с одним файлом из нескольких задач, добавьте имя виртуального каталога в составе имени файла, чтобы диффегировать эти файлы. Например, задайте для свойства Path идентификатор задачи, символ разделителя (обычно косая черта) и имя файла:
path: taskId + @"/output.txt"
Абсолютные URI выходных файлов для набора задач будут похожи на следующие:
https://myaccount.blob.core.windows.net/mycontainer/task1/output.txt
https://myaccount.blob.core.windows.net/mycontainer/task2/output.txt
Дополнительные сведения о виртуальных каталогах в службе хранилища Azure см. в разделе "Список объектов BLOB в контейнере".
Многие выходные файлы
Если задача задает многочисленные выходные файлы, вы можете столкнуться с ограничениями, введенными API пакетной службы Azure. Рекомендуется уменьшить размер задач и количество выходных файлов.
Если вы столкнулись с ограничениями, попробуйте уменьшить количество выходных файлов, используя шаблоны файлов или используя контейнеры файлов, например tar или zip, для консолидации выходных файлов. Кроме того, используйте монтаж или другие подходы для сохранения выходных данных (см. раздел «Сохранение выходных данных заданий и задач»).
Диагностика ошибок отправки файлов
Если отправка выходных файлов в служба хранилища Azure завершается ошибкой, задача переходит в состояние Completed, а свойству BatchTaskExecutionInfo.FailureInfo присваивается значение. Проверьте свойство FailureInformation , чтобы определить, какая ошибка произошла. Например, при отправке файла возникает ошибка, если контейнер не найден:
Category: UserError
Code: FileUploadContainerNotFound
Message: One of the specified Azure container(s) was not found while attempting to upload an output file
При каждой отправке файла пакетная служба записывает два файла журнала в вычислительный узел fileuploadout.txt и fileuploaderr.txt. Эти файлы журнала можно просмотреть, чтобы узнать больше о конкретном сбое. В случаях, когда отправка файла никогда не была предпринята, например из-за того, что сама задача не могла выполняться, эти файлы журнала не будут существовать.
Диагностика производительности отправки файлов
Файл fileuploadout.txt фиксирует ход загрузки. Этот файл можно просмотреть, чтобы узнать больше о том, сколько времени занимает отправка файлов. Помните, что на производительность загрузки влияет множество факторов, включая размер узла, другие действия на узле в момент загрузки, если целевой контейнер находится в том же регионе, что и пул Batch, сколько узлов загружаются в учетную запись хранения одновременно и т. д.
Используйте API пакетной службы в соответствии со стандартом Batch File Conventions.
При сохранении выходных данных задачи с помощью API службы пакетной обработки можно присвоить имя целевому контейнеру и BLOB-объектам, как вам угодно. Вы также можете присвоить им имя в соответствии с соглашениями о пакетных файлах. Стандарт "Соглашения о файлах" определяет имена целевого контейнера и большого двоичного объекта в службе хранилища Azure для заданного выходного файла на основе имен задания и задачи. Если вы используете стандарт "Соглашения о файлах" для именования выходных файлов, выходные файлы доступны для просмотра на портале Azure.
При разработке в C#можно использовать методы, встроенные в библиотеку соглашений о пакетных файлах для .NET. Эта библиотека создает правильные именованные контейнеры и пути Блоб. Например, можно вызвать API, чтобы получить правильное имя контейнера на основе имени задания:
// Convention used by Azure.Batch.Conventions.Files: "job-{jobId}".
string containerName = $"job-{jobId.ToLowerInvariant()}";
Метод CloudJobExtensions.GetOutputStorageContainerUrl можно использовать для возврата URL с подписью SAS, чтобы записывать в контейнер. Затем этот SAS можно передать в конструктор OutputFileBlobContainerDestination.
Если вы разрабатываетесь на языке, отличном от C#, вам потребуется реализовать стандартный стандарт файловых соглашений самостоятельно.
Пример кода
Пример проекта PersistOutputs является одним из примеров кода пакетной службы Azure на GitHub. Это решение Visual Studio демонстрирует использование клиентской библиотеки Batch для .NET для сохранения данных выходных результатов задач в устойчивом хранилище. Чтобы запустить пример, выполните следующие действия.
- Откройте проект в Visual Studio 2019.
- Добавьте учетные данные учетной записи Batch и Storage в AccountSettings.settings в проекте Microsoft.Azure.Batch.Samples.Common.
- Соберите (но не запускайте) решение. При появлении запроса восстановите все пакеты NuGet.
- Используйте портал Azure для отправки пакета приложения для PersistOutputsTask. Включите
PersistOutputsTask.exeи зависящие сборки в пакет .zip, установите идентификатор приложения на "PersistOutputsTask", а версию пакета приложения — на "1.0". - Запустите проект PersistOutputs.
- При появлении запроса на выбор технологии сохраняемости, используемой для выполнения примера, введите 2 , чтобы запустить пример с помощью API пакетной службы для сохранения выходных данных задачи.
- При необходимости запустите пример еще раз, введя 3 , чтобы сохранить выходные данные с помощью API пакетной службы, а также назовите целевой контейнер и путь к BLOB-объектам в соответствии со стандартом "Соглашения о файлах".
Дальнейшие действия
- Дополнительные сведения о сохранении выходных данных задачи с помощью библиотеки File Conventions для .NET см. в статье Как сохранять данные заданий и задач в службе хранилища Azure с использованием библиотеки Batch File Conventions для .NET.
- Дополнительные сведения о других подходах к хранению выходных данных в пакетная служба Azure см. в статье "Сохранение выходных данных заданий и задач в служба хранилища Azure".