빠른 시작: .NET을 사용하여 Batch 풀 만들기 및 작업 실행

이 빠른 시작에서는 Azure Batch .NET API를 사용하는 C# 앱을 실행하여 Azure Batch를 시작하는 방법을 보여줍니다. .NET 앱:

  • Batch 작업 처리에 사용할 여러 입력 데이터 파일을 Azure Storage Blob 컨테이너에 업로드합니다.
  • Windows Server를 실행하는 두 개의 VM(가상 머신) 또는 컴퓨팅 노드의 풀을 만듭니다.
  • Windows 명령줄을 사용하여 각 입력 파일을 처리하는 노드에서 작업을 실행하는 작업을 만듭니다.
  • 태스크가 반환하는 출력 파일을 표시합니다.

이 빠른 시작을 완료하면 Batch 서비스의 주요 개념을 이해하고 보다 현실적인 대규모 워크로드에서 Batch를 사용할 준비가 됩니다.

필수 조건

앱 실행

이 빠른 시작을 완료하려면 앱을 다운로드하거나 복제하고, 계정 값을 제공하고, 앱을 빌드 및 실행하고, 출력을 확인합니다.

앱 다운로드 또는 복제

GitHub에서 Azure Batch .NET 빠른 시작 앱을 다운로드하거나 복제합니다. 다음 명령을 사용하여 Git 클라이언트를 사용하여 앱 리포지토리를 복제합니다.

git clone https://github.com/Azure-Samples/batch-dotnet-quickstart.git

계정 정보 제공

앱은 Batch 및 Storage 계정 이름, 계정 키 값 및 Batch 계정 엔드포인트를 사용해야 합니다. Azure Portal, Azure API 또는 명령줄 도구에서 이 정보를 가져올 수 있습니다.

Azure Portal에서 계정 정보를 얻으려면 다음을 수행합니다.

  1. Azure Search 표시줄에서 Batch 계정 이름을 검색하여 선택합니다.
  • Batch 계정
  • 계정 엔드포인트
  • 스토리지 계정 이름
  • 구독 ID
  • 리소스 그룹 이름

다운로드한 batch-dotnet-quickstart 폴더로 이동하고 Program.cs 자격 증명 문자열을 편집하여 복사한 값을 제공합니다.

// Batch account credentials
const string BatchAccountName = "<batch account>";
const string BatchAccountUrl  = "<account endpoint>";

// Azure Resource Manager credentials for the Batch account
const string SubscriptionId    = "<subscription ID>";
const string ResourceGroupName = "<resource group name>";

// Storage account credentials
const string StorageAccountName = "<storage account name>";

앱 빌드 및 실행 및 출력 보기

실행 중인 Batch 워크플로를 보려면 Visual Studio에서 애플리케이션을 빌드하고 실행합니다. 명령줄 dotnet builddotnet run 명령을 사용할 수도 있습니다.

Visual Studio에서:

  1. BatchDotNetQuickstart.sln 파일을 열고 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭한 다음 빌드를 선택합니다. 메시지가 표시되면 NuGet 패키지 관리자 를 사용하여 NuGet 패키지를 업데이트하거나 복원합니다.

  2. 빌드가 완료되면 상단 메뉴 모음에서 BatchDotNetQuickstart 를 선택하여 앱을 실행합니다.

기본 구성의 일반적인 런타임은 약 5분입니다. 초기 풀 노드 설정에는 시간이 가장 걸립니다. 작업을 다시 실행하려면 이전 실행에서 작업을 삭제하지만 풀을 삭제하지 마세요. 미리 구성된 풀에서 작업이 몇 초 안에 완료됩니다.

앱은 다음 예제와 유사한 출력을 반환합니다.

Sample start: 11/16/2022 4:02:54 PM

Container [input] created.
Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [DotNetQuickstartPool]...
Creating job [DotNetQuickstartJob]...
Adding 3 tasks to job [DotNetQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

풀의 컴퓨팅 노드가 시작되는 동안 Monitoring all tasks for 'Completed' state, timeout in 00:30:00...에서 일시 중지됩니다. 작업이 생성되면 Batch는 풀에서 실행될 수 있도록 큐에 넣습니다. 첫 번째 컴퓨팅 노드를 사용할 수 있게 되면 첫 번째 작업이 노드에서 실행됩니다. Azure Portal의 Batch 계정 페이지에서 노드, 작업 및 작업 상태를 모니터링할 수 있습니다.

각 작업이 완료되면 다음 예제와 유사한 출력이 표시됩니다.

Printing task output.
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard out:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...
stderr:
...

코드 검토

코드를 검토하여 Azure Batch .NET 빠른 시작의 단계를 이해합니다.

서비스 클라이언트 만들기 및 리소스 파일 업로드

  1. 스토리지 계정과 상호 작용하기 위해 앱은 .NET용 Azure Storage Blob 클라이언트 라이브러리를 사용하여 BlobServiceClient를 만듭니다.

    string blobUri = "https://" + storageAccountName + ".blob.core.windows.net";
    
    var blobServiceClient = new BlobServiceClient(new Uri(blobUri), new DefaultAzureCredential());
    return blobServiceClient;
    
  2. 앱은 참조를 blobServiceClient 사용하여 스토리지 계정에 컨테이너를 만들고 컨테이너에 데이터 파일을 업로드합니다. 스토리지의 파일은 Batch가 나중에 컴퓨팅 노드에 다운로드할 수 있는 Batch ResourceFile 개체로 정의됩니다.

    List<string> inputFilePaths = new()
    {
        "taskdata0.txt",
        "taskdata1.txt",
        "taskdata2.txt"
    };
    
    var inputFiles = new List<ResourceFile>();
    
    foreach (var filePath in inputFilePaths)
    {
        inputFiles.Add(UploadFileToContainer(containerClient, inputContainerName, filePath));
    }
    
  3. 앱은 Batch 작업과 태스크를 만들고 관리하기 위해 Azure.Compute.Batch 라이브러리에서 BatchClient 개체를 생성합니다. Batch 클라이언트는 Microsoft Entra 인증을 사용합니다.

    BatchClient batchClient = new BatchClient(new Uri(BatchAccountUrl), new DefaultAzureCredential());
    ...
    
  4. 앱은 또한 Azure.ResourceManager.Batch 라이브러리를 사용하여 Batch 계정 및 해당 풀을 관리합니다. ArmClient를 만들고 구독 ID, 리소스 그룹 이름 및 Batch 계정 이름을 사용하여 Batch 계정에 대한 BatchAccountResource 참조를 가져옵니다.

    ArmClient armClient = new ArmClient(new DefaultAzureCredential());
    
    ResourceIdentifier batchAccountIdentifier = BatchAccountResource.CreateResourceIdentifier(
        SubscriptionId,
        ResourceGroupName,
        BatchAccountName);
    
    BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountIdentifier);
    

컴퓨팅 노드 풀 만들기

Batch 풀을 만들기 위해 앱은 BatchAccountPoolCollection.CreateOrUpdateAsync 메서드를 사용하여 노드 수, VM 크기 및 풀 구성을 설정합니다. 다음 BatchVmConfiguration 개체는 Windows Server Marketplace 이미지에 BatchImageReference 지정합니다. Batch는 광범위한 Windows Server 및 Linux Marketplace OS 이미지를 지원하고 사용자 지정 VM 이미지도 지원합니다.

PoolNodeCountPoolVMSize VM 크기는 정의된 상수입니다. 앱은 두 개의 Standard_A1_v2 노드로 구성된 풀을 만듭니다. 이 크기는 이 빠른 시작의 성능과 비용의 적절한 균형을 제공합니다.

BatchImageReference imageReference = new BatchImageReference()
{
    Publisher = "MicrosoftWindowsServer",
    Offer = "WindowsServer",
    Sku = "2016-datacenter-smalldisk",
    Version = "latest"
};

BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.windows amd64");

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = PoolVMSize,
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = PoolNodeCount }
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, PoolId, poolData);

Batch 작업 만들기

Batch 작업은 하나 이상의 태스크를 논리적으로 그룹화한 것입니다. 작업에는 우선 순위 및 태스크를 실행할 풀과 같은 태스크에 공통적으로 적용되는 설정이 포함됩니다.

앱은 BatchClient.CreateJobAsync 를 사용하여 풀에서 작업을 만듭니다. 처음에는 작업에 태스크가 없습니다.

BatchJobCreateOptions job = new BatchJobCreateOptions(JobId, new BatchPoolInfo() { PoolId = PoolId });
await batchClient.CreateJobAsync(job);

작업 만들기

Batch는 컴퓨팅 노드에 앱과 스크립트를 배포하는 여러 가지 방법을 제공합니다. 이 앱은 BatchTaskCreateOptions 입력 ResourceFile 개체 목록을 만듭니다. 각 태스크는 CommandLine 속성을 사용하여 입력 파일을 처리합니다. Batch 명령줄은 앱 또는 스크립트를 지정하는 위치입니다.

다음 코드의 명령줄은 Windows type 명령을 실행하여 입력 파일을 표시합니다. 그런 다음, 앱은 BatchClient.CreateTasksAsync를 사용하여 작업에 작업을 추가합니다. 이 작업은 컴퓨팅 노드에서 실행할 작업을 큐에 대기합니다.

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);
    string inputFilename = inputFiles[i].FilePath;
    string taskCommandLine = String.Format("cmd /c type {0}", inputFilename);

    BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId, taskCommandLine)
    {
        ResourceFiles = { inputFiles[i] }
    };
    tasks.Add(task);
}

await batchClient.CreateTasksAsync(JobId, tasks);

태스크 출력 보기

앱은 작업이 완료되기를 기다립니다. 각 작업이 성공적으로 실행되면 출력이 stdout.txt기록됩니다. 그런 다음, 앱은 BatchTask.NodeInfo 속성을 사용하여 완료된 각 작업에 대한 stdout.txt 파일을 표시합니다.

await foreach (BatchTask task in batchClient.GetTasksAsync(JobId))
{
    string nodeId = task.NodeInfo?.NodeId ?? "<unknown>";
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    BinaryData stdout = await batchClient.GetTaskFileAsync(JobId, task.Id, "stdout.txt");
    Console.WriteLine(stdout.ToString());
}

자원을 정리하세요

앱은 만든 스토리지 컨테이너를 자동으로 삭제하고 Batch 풀 및 작업을 삭제하는 옵션을 제공합니다. 풀과 노드는 작업을 실행하지 않더라도 노드가 실행되는 동안 요금이 발생합니다. 풀이 더 이상 필요하지 않으면 삭제합니다.

Batch 계정 및 스토리지 계정이 더 이상 필요하지 않은 경우 해당 계정이 포함된 리소스 그룹을 삭제할 수 있습니다. Azure Portal에서 리소스 그룹 페이지의 맨 위에 있는 리소스 그룹 삭제를 선택합니다. 리소스 그룹 삭제 화면에서 리소스 그룹 이름을 입력한 다음 삭제를 선택합니다.

다음 단계

이 빠른 시작 가이드에서는 Batch .NET API를 사용하여 Batch 풀, 노드, 작업 및 태스크를 생성하는 애플리케이션을 실행했습니다. 작업은 리소스 파일을 스토리지 컨테이너에 업로드하고, 노드에서 작업을 실행하고, 노드의 출력을 표시했습니다.

이제 Batch 서비스의 주요 개념을 이해했으므로 보다 현실적이고 대규모 워크로드에서 Batch를 사용할 준비가 되었습니다. Azure Batch에 대해 자세히 알아보고 실제 애플리케이션을 사용하여 병렬 워크로드를 살펴보려면 Batch .NET 자습서를 계속 진행하세요.