.NET용 Batch 파일 규칙 라이브러리를 사용하여 Azure Storage에 작업 및 태스크 데이터 유지

Azure Batch에서 실행 중인 태스크는 실행 시 출력 데이터를 생성할 수 있습니다. 작업의 다른 태스크, 작업을 실행한 클라이언트 애플리케이션 또는 둘 다에서 검색할 수 있도록 태스크 출력 데이터는 종종 저장할 필요가 있습니다. 태스크는 Batch 컴퓨팅 노드의 파일 시스템에 출력 데이터를 쓰지만, 노드 이미지를 다시 만들거나 노드에서 풀을 종료할 때 해당 노드의 모든 데이터가 손실됩니다. 또한 태스크에는 파일 보존 기간이 있을 수 있으며, 그 후에는 해당 태스크에서 만든 파일이 삭제됩니다. 이러한 이유로 나중에 Azure Storage와 같은 데이터 저장소에 필요한 태스크 출력을 유지하는 것이 중요합니다.

Batch의 스토리지 계정 옵션은 Batch 계정 및 Azure Storage 계정을 참조하세요.

.NET용 파일 규칙 라이브러리를 사용하여 Azure Batch의 태스크 데이터를 유지할 수 있습니다. 파일 규칙 라이브러리는 태스크 출력 데이터를 Azure Storage에 저장하고 검색하는 프로세스를 간소화합니다. 태스크 및 클라이언트 코드 둘 다에서 파일 규칙 라이브러리를 사용할 수 있습니다. 태스크 모드에서 라이브러리를 사용하여 파일을 유지합니다. 클라이언트 모드에서 라이브러리를 사용하여 파일을 나열하고 검색합니다. 또한 태스크 코드에서 라이브러리를 사용하여 태스크 종속성 시나리오에서와 같이 업스트림 태스크의 출력을 검색할 수도 있습니다.

파일 규칙 라이브러리에서 출력 파일을 검색하려면 작업 또는 태스크에 대한 파일을 찾습니다. 파일의 이름이나 위치를 알 필요가 없습니다. 대신, ID 및 용도별로 파일을 나열할 수 있습니다. 예를 들어 지정된 태스크에 대한 모든 중간 파일을 나열합니다. 또는 지정된 작업에 대한 미리 보기 파일을 가져옵니다.

2017-05-01 버전 이상에서는 Batch 서비스 API에서 VM(가상 머신) 구성으로 만든 풀에서 실행되는 태스크 및 작업 관리자 태스크의 출력 데이터를 Azure Storage에 유지하도록 지원합니다. 태스크를 만드는 코드 내에서 출력을 유지할 수 있습니다. 이 방법은 파일 규칙 라이브러리 대신 사용됩니다. 태스크가 실행 중인 애플리케이션을 업데이트하지 않고도 출력을 유지하도록 Batch 클라이언트 애플리케이션을 수정할 수 있습니다. 자세한 내용은 Batch 서비스 API를 사용하여 Azure Storage에 태스크 데이터 유지를 참조하세요.

라이브러리 사용 사례

Azure Batch는 태스크 출력을 유지하는 여러 가지 방법을 제공합니다. 다음을 수행하려는 경우 파일 규칙 라이브러리를 사용합니다.

  • 태스크가 파일 유지를 위해 실행 중인 애플리케이션에 대한 코드를 수정합니다.
  • 태스크가 계속 실행되는 동안 Azure Storage로 데이터를 스트리밍합니다.
  • 풀에서 데이터를 유지합니다.
  • 클라이언트 애플리케이션 또는 기타 태스크에서 ID 또는 용도로 태스크 출력 파일을 찾아 다운로드합니다.
  • Azure Portal에서 태스크 출력을 확인합니다.

다른 시나리오의 경우 다른 접근 방식을 고려할 수 있습니다. 다른 옵션에 대한 자세한 내용은 Azure Storage에 작업 및 태스크 출력 유지를 참조하세요.

Batch 파일 규칙 표준이란?

Batch 파일 규칙 표준(영문)은 출력 파일이 작성되는 대상 컨테이너 및 Blob 경로에 대한 이름 지정 체계를 제공합니다. 표준에 따라 Azure 스토리지에 유지되는 파일은 Azure Portal에서 자동으로 볼 수 있습니다.

.NET용 파일 규칙 라이브러리는 표준에 따라 스토리지 컨테이너와 태스크 출력 파일의 이름을 자동으로 지정합니다. 이 라이브러리는 Azure Storage에서 출력 파일을 쿼리하기 위한 방법도 제공합니다. 작업 ID, 태스크 ID 또는 용도별로 쿼리할 수 있습니다.

.NET 이외의 언어로 개발하는 경우 애플리케이션에서 파일 규칙 표준을 직접 구현할 수 있습니다. 자세한 내용은 Batch 파일 규칙 표준 구현을 참조하세요.

파일 규칙 라이브러리를 사용하여 Azure Storage에 출력 데이터를 유지하려면 먼저 Azure Storage 계정을 Batch 계정에 연결합니다.

  1. Azure Portal에 로그인합니다.
  2. 검색 창에서 Batch를 검색하고 선택합니다.
  3. Azure Storage에 연결할 Batch 계정을 선택합니다.
  4. Batch 계정 페이지의 설정에서 스토리지 계정을 선택합니다.
  5. Batch 계정과 연결된 Azure Storage 계정이 아직 없으면 Storage 계정(없음)을 선택합니다.
  6. 사용할 Azure Storage 계정을 선택합니다. 최상의 성능을 위해서는 Batch 계정과 동일한 지역에서 계정을 사용합니다.

출력 데이터 유지

파일 규칙 라이브러리를 사용하여 작업 및 태스크 출력 데이터를 유지할 수 있습니다. 먼저 Azure Storage에 컨테이너를 만듭니다. 그런 다음, 출력을 컨테이너에 저장합니다. 태스크 코드에서 .NET용 Azure Storage 클라이언트 라이브러리를 사용하여 태스크 출력을 컨테이너에 업로드합니다.

Azure Storage의 컨테이너와 Blob 사용에 대한 자세한 내용은 .NET을 사용하여 Azure Blob 스토리지 시작을 참조하세요.

파일 규칙 라이브러리를 사용하여 유지되는 모든 작업 및 태스크 출력은 동일한 컨테이너에 저장됩니다. 많은 수의 태스크에서 동시에 파일을 유지하려고 하면 Azure Storage이 적용될 수 있습니다. 자세한 내용은 Blob Storage에 대한 성능 및 확장성 검사 목록을 참조하세요.

스토리지 컨테이너 만들기

Azure Storage에 태스크 출력을 유지하려면 먼저 CloudJob.PrepareOutputStorageAsync를 호출하여 컨테이너를 만듭니다. 이 확장 메서드는 CloudStorageAccount 개체를 매개 변수로 사용합니다. 이 메서드는 파일 규칙 표준에 따라 명명된 컨테이너를 만듭니다. 컨테이너의 콘텐츠는 이 문서에 설명된 Azure Portal 및 검색 메서드를 통해 검색할 수 있습니다.

일반적으로 풀, 작업 및 태스크를 만드는 클라이언트 애플리케이션에서 컨테이너를 만듭니다. 예시:

CloudJob job = batchClient.JobOperations.CreateJob(
    "myJob",
    new PoolInformation { PoolId = "myPool" });

// Create reference to the linked Azure Storage account
CloudStorageAccount linkedStorageAccount =
    new CloudStorageAccount(myCredentials, true);

// Create the blob storage container for the outputs
await job.PrepareOutputStorageAsync(linkedStorageAccount);

태스크 출력 저장

태스크는 스토리지 컨테이너를 만든는 TaskOutputStorage를 사용하여 출력을 컨테이너에 저장할 수 있습니다. 이 클래스는 파일 규칙 라이브러리에서 사용할 수 있습니다.

태스크 코드에서 TaskOutputStorage 개체를 만듭니다. 태스크는 해당 작업을 완료하면 TaskOutputStorage.SaveAsync 메서드를 호출합니다. 이 단계에서는 출력을 Azure Storage에 저장합니다.

CloudStorageAccount linkedStorageAccount = new CloudStorageAccount(myCredentials);
string jobId = Environment.GetEnvironmentVariable("AZ_BATCH_JOB_ID");
string taskId = Environment.GetEnvironmentVariable("AZ_BATCH_TASK_ID");

TaskOutputStorage taskOutputStorage = new TaskOutputStorage(
    linkedStorageAccount, jobId, taskId);

/* Code to process data and produce output file(s) */

await taskOutputStorage.SaveAsync(TaskOutputKind.TaskOutput, "frame_full_res.jpg");
await taskOutputStorage.SaveAsync(TaskOutputKind.TaskPreview, "frame_low_res.jpg");

TaskOutputStorage.SaveAsync 메서드의 kind 매개 변수는 유지된 파일을 분류합니다. 미리 정의된 4개의 TaskOutputKind 형식, 즉, TaskOutput, TaskPreview, TaskLogTaskIntermediate.가 있습니다. 사용자 지정 범주의 출력도 정의할 수 있습니다.

나중에 Batch를 쿼리할 때 나열할 출력 유형을 지정합니다. 그런 후 태스크에 대한 출력을 나열할 때 출력 형식 중 하나로 필터링할 수 있습니다. 예를 들어, “태스크 109에 대한 미리 보기 출력을 제공”하도록 필터링합니다. 자세한 내용은 출력 데이터 검색을 참조하세요.

출력 형식은 Azure Portal에서 출력 파일이 표시되는 위치도 결정합니다. TaskOutput 범주의 파일은 태스크 출력 파일 아래에 있습니다. TaskLog 범주의 파일은 태스크 로그 아래에 있습니다.

작업 출력 저장

전체 작업과 연결된 출력을 저장할 수도 있습니다. 예를 들어 영화 렌더링 작업의 병합 태스크에서 완전히 렌더링된 영화를 작업 출력으로 유지할 수 있습니다. 작업이 완료되면 클라이언트 애플리케이션은 작업의 출력을 나열하고 검색할 수 있습니다. 클라이언트 애플리케이션은 개별 태스크를 쿼리할 필요가 없습니다.

JobOutputStorage.SaveAsync 메서드를 호출하여 작업 출력을 저장합니다. JobOutputKind 및 파일 이름을 지정합니다. 예시:

CloudJob job = new JobOutputStorage(acct, jobId);
JobOutputStorage jobOutputStorage = job.OutputStorage(linkedStorageAccount);

await jobOutputStorage.SaveAsync(JobOutputKind.JobOutput, "mymovie.mp4");
await jobOutputStorage.SaveAsync(JobOutputKind.JobPreview, "mymovie_preview.mp4");

태스크 출력에 대한 TaskOutputKind 형식과 마찬가지로 JobOutputKind 형식을 사용하여 작업의 유지된 파일을 분류합니다. 나중에 특정 유형의 출력을 나열할 수 있습니다. JobOutputKind 유형에는 출력 및 미리 보기 범주가 모두 포함됩니다. 이 유형은 사용자 지정 범주 만들기도 지원합니다.

태스크 로그 저장

태스크를 실행하는 동안 업데이트된 파일을 유지해야 할 수도 있습니다. 예를 들어 로그 파일 또는 stdout.txtstderr.txt를 유지해야 할 수 있습니다. 파일 규칙 라이브러리는 TaskOutputStorage.SaveTrackedAsync 메서드를 제공하여 이러한 종류의 파일을 유지합니다. SaveTrackedAsync를 사용하여 지정된 간격으로 노드의 파일에 대한 업데이트를 추적합니다. 그런 다음, 해당 업데이트를 Azure Storage에 유지합니다.

다음 예제에서는 SaveTrackedAsync를 사용하여 태스크가 실행되는 동안 15초마다 Azure Storage에서 stdout.txt를 업데이트합니다.

TimeSpan stdoutFlushDelay = TimeSpan.FromSeconds(3);
string logFilePath = Path.Combine(
    Environment.GetEnvironmentVariable("AZ_BATCH_TASK_DIR"), "stdout.txt");

// The primary task logic is wrapped in a using statement that sends updates to
// the stdout.txt blob in Storage every 15 seconds while the task code runs.
using (ITrackedSaveOperation stdout =
        await taskStorage.SaveTrackedAsync(
        TaskOutputKind.TaskLog,
        logFilePath,
        "stdout.txt",
        TimeSpan.FromSeconds(15)))
{
    /* Code to process data and produce output file(s) */

    // We are tracking the disk file to save our standard output, but the
    // node agent may take up to 3 seconds to flush the stdout stream to
    // disk. So give the file a moment to catch up.
     await Task.Delay(stdoutFlushDelay);
}

주석 처리된 섹션 Code to process data and produce output file(s)를 태스크에서 일반적으로 수행하는 코드로 바꿉니다. 예를 들어 Azure Storage에서 데이터를 다운로드하고 변환 또는 계산을 수행하는 코드가 있을 수 있습니다. 이 코드를 using 블록에 래핑하여 SaveTrackedAsync로 파일을 주기적으로 업데이트할 수 있습니다.

노드 에이전트는 풀의 각 노드에서 실행되는 프로그램입니다. 이 프로그램은 노드와 Batch 서비스 간의 명령 및 제어 인터페이스를 제공합니다. Task.Delay 호출은 이 using 블록의 끝에 필요합니다. 이 호출은 노드 에이전트가 노드의 stdout.txt 파일로 표준 콘텐츠를 플러시할 시간이 확보되도록 합니다. 이 지연 시간이 없다면 마지막 몇 초의 출력이 누락될 수 있습니다. 모든 파일에 대해 이 지연이 필요하지는 않을 수 있습니다.

SaveTrackedAsync를 통해 파일 추적을 사용하도록 설정하면 추적된 파일의 추가 항목만 Azure Storage에 유지됩니다. 이 메서드는 회전하지 않는 로그 파일 또는 파일 끝에 추가 작업으로 기록된 다른 파일을 추적하는 데에만 사용합니다.

출력 데이터 검색

특정 태스크 또는 작업에 대한 출력 파일을 검색하려면 Azure Storage의 경로 또는 파일 이름을 알 필요가 없습니다. 대신 태스크별 또는 작업 ID별로 출력 파일을 요청할 수 있습니다.

다음 예제 코드는 작업의 태스크를 반복합니다. 다음으로, 코드는 태스크의 출력 파일에 대한 일부 정보를 출력합니다. 그런 다음, 코드는 AzureStorage에서 파일을 다운로드합니다.

foreach (CloudTask task in myJob.ListTasks())
{
    foreach (OutputFileReference output in
        task.OutputStorage(storageAccount).ListOutputs(
            TaskOutputKind.TaskOutput))
    {
        Console.WriteLine($"output file: {output.FilePath}");

        output.DownloadToFileAsync(
            $"{jobId}-{output.FilePath}",
            System.IO.FileMode.Create).Wait();
    }
}

Azure Portal에서 출력 파일 보기

태스크 출력 파일이 Batch 파일 규칙 표준을 사용하는 경우 Azure Portal의 파일을 볼 수 있습니다.

포털에서 출력 파일을 표시하려면 다음 요구 사항을 충족해야 합니다.

출력 파일이 Azure Portal에 자동으로 표시되려면 다음을 수행해야 합니다.

  1. Batch 계정에 Azure Storage 계정을 연결합니다.
  2. Azure Storage 컨테이너 및 파일에 대한 미리 정의된 명명 규칙을 따릅니다. 모든 정의는 추가 정보에서 검토합니다. 파일 규칙 라이브러리를 사용하여 출력을 유지하면 파일이 파일 규칙 표준에 따라 유지됩니다.

Azure Portal에서 태스크 출력 파일 및 로그를 보려면 다음을 수행합니다.

  1. Azure Portal에 로그인합니다.
  2. 출력을 보려는 태스크로 이동합니다.
  3. 저장된 출력 파일 또는 저장된 로그를 선택합니다.

코드 샘플

PersistOutputs 샘플 프로젝트는 GitHub의 Azure Batch 코드 샘플 중 하나입니다. 이 Visual Studio 솔루션은 Azure Batch 파일 규칙 라이브러리를 사용하여 영구 스토리지에 태스크 출력을 보관하는 방법을 보여 줍니다. 샘플을 실행하려면 다음 단계를 수행합니다.

  1. Visual Studio 2019에서 프로젝트를 엽니다.
  2. Microsoft.Azure.Batch.Samples.Common 프로젝트에서 Batch 및 Azure Storage 계정 자격 증명을 AccountSettings.settings에 추가합니다.
  3. 솔루션을 빌드합니다. 솔루션을 아직 실행하지 않도록 합니다.
  4. 메시지가 표시되면 NuGet 패키지를 복원합니다.
  5. Azure Portal을 통해 PersistOutputsTask에 대한 애플리케이션 패키지를 업로드합니다.
    1. PersistOutputsTask.exe 실행 파일 및 해당 종속 어셈블리를 .zip 패키지에 포함합니다.
    2. 애플리케이션 ID를 PersistOutputsTask로 설정합니다.
    3. 애플리케이션 패키지 버전을 1.0으로 설정합니다.
  6. 시작을 선택하여 프로젝트를 실행합니다.
  7. 사용할 지속성 기술을 선택하라는 메시지가 표시되면 1을 입력합니다. 이 옵션은 파일 규칙 라이브러리로 샘플을 실행하여 태스크 출력을 유지합니다.

.NET용 Batch 파일 규칙 라이브러리 가져오기

.NET용 Batch 파일 규칙 라이브러리는 NuGet에서 사용할 수 있습니다. 확장 라이브러리는 새 메서드가 포함된 CloudJobCloudTask 클래스입니다. 자세한 내용은 파일 규칙 라이브러리 참조 설명서를 참조하세요.

파일 규칙 라이브러리 소스 코드는 GitHub에서 사용할 수 있습니다.

다음 단계