JavaScript용 Batch SDK 시작

Azure Batch JavaScript SDK를 사용하여 JavaScript에서 Batch 클라이언트를 빌드하는 기본 사항을 알아봅니다. 일괄 처리 애플리케이션에 대한 시나리오를 단계별로 이해한 다음, JavaScript를 사용하여 설정해 보겠습니다.

필수 조건

이 문서에서는 사용자가 JavaScript에 대한 실용적인 지식을 가지고 Linux에 익숙하다고 가정합니다. 또한 Batch 및 Storage 서비스를 만들 액세스 권한이 있는 Azure 계정을 갖고 있다고 가정합니다.

이 문서에 설명된 단계를 진행하기 전에 Azure Batch 기술 개요를 읽어 보시기 바랍니다.

시나리오 이해

여기에는 Azure Blob Storage 컨테이너에서 모든 csv 파일을 다운로드하여 JSON으로 변환하는 Python으로 작성된 간단한 스크립트가 있습니다. 여러 스토리지 계정 컨테이너를 병렬로 처리하려면 스크립트를 Azure Batch 작업으로 배포하면 됩니다.

Azure Batch 아키텍처

다음 다이어그램은 Azure Batch 및 클라이언트를 사용하여 Python 스크립트를 확장하는 방법을 보여줍니다.

Diagram showing scenario architecture.

JavaScript 샘플은 스토리지 계정에 있는 컨테이너의 수에 따라 준비 작업(나중에 자세히 설명)과 작업 세트를 사용하여 일괄 처리 작업을 배포합니다. GitHub 리포지토리에서 스크립트를 다운로드할 수 있습니다.

지정된 링크의 JavaScript 샘플에는 Azure 함수 앱으로 배포할 특정 코드가 포함되어 있지 않습니다. 만드는 방법에 대한 지침은 다음 링크를 참조하세요.

애플리케이션 빌드

이제 단계별 프로세스에 따라 JavaScript 클라이언트를 빌드하겠습니다.

1단계: Azure Batch SDK 설치

npm install 명령을 사용하여 JavaScript용 Azure Batch SDK를 설치할 수 있습니다.

npm install @azure/batch

이 명령은 최신 버전의 azure-batch JavaScript SDK를 설치합니다.

Azure 함수 앱의 Azure 함수 설정 탭에서 "Kudu 콘솔"로 이동하여 npm install 명령을 실행합니다. 이 경우 JavaScript용 Azure Batch SDK를 설치합니다.

2단계: Azure Batch 계정 만들기

Azure Portal 또는 명령줄(PowerShell /Azure CLI)에서 만들 수 있습니다.

다음은 Azure CLI를 통해 계정을 만드는 명령입니다.

Batch 계정을 만들 리소스가 이미 있는 경우 리소스 그룹을 만들고 이 단계를 건너뜁니다.

az group create -n "<resource-group-name>" -l "<location>"

다음으로 Azure Batch 계정을 만듭니다.

az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"

각 Batch 계정에는 해당하는 액세스 키가 있습니다. 이러한 키는 Azure Batch 계정에 추가 리소스를 만드는 데 필요합니다. 프로덕션 환경의 경우 Azure Key Vault를 사용하여 이러한 키를 저장하는 것이 좋습니다. 그런 다음 애플리케이션의 서비스 주체를 만듭니다. 이 서비스 주체를 사용하여 애플리케이션에서 Key Vault의 키에 액세스하는 OAuth 토큰을 만들 수 있습니다.

az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"

후속 단계에서 사용할 키를 복사하여 저장합니다.

3단계: Azure Batch 서비스 클라이언트 만들기

다음 코드 조각은 먼저 azure-batch JavaScript 모듈을 가져온 다음, Batch 서비스 클라이언트를 만듭니다. 먼저 이전 단계에서 복사한 Batch 계정 키로 SharedKeyCredentials 개체를 만들어야 합니다.

// Initializing Azure Batch variables

import { BatchServiceClient, BatchSharedKeyCredentials } from "@azure/batch";

// Replace values below with Batch Account details
const batchAccountName = '<batch-account-name>';
const batchAccountKey = '<batch-account-key>';
const batchEndpoint = '<batch-account-url>';

const credentials = new BatchSharedKeyCredentials(batchAccountName, batchAccountKey);
const batchClient = new BatchServiceClient(credentials, batchEndpoint);

Azure Batch URI는 Azure Portal의 개요 탭에서 찾을 수 있습니다. 다음과 같은 형식입니다.

https://accountname.location.batch.azure.com

스크린샷을 참조하세요.

Azure batch uri

4단계: Azure Batch 풀 만들기

Azure Batch 풀은 여러 VM(Batch 노드라고도 함)으로 구성됩니다. Azure Batch 서비스는 이러한 노드에 작업을 배포하고 관리합니다. 풀에 대해 다음 구성 매개 변수를 정의할 수 있습니다.

  • Virtual Machine 이미지의 유형
  • Virtual Machine 노드의 크기
  • Virtual Machine 노드의 수

Virtual Machine 노드의 크기와 수는 병렬로 실행하려는 작업의 수와 작업 자체에 따라 크게 달라집니다. 테스트를 통해 이상적인 수와 크기를 결정하는 것이 좋습니다.

다음은 구성 매개 변수 개체를 만드는 코드 조각입니다.

// Creating Image reference configuration for Ubuntu Linux VM
const imgRef = {
    publisher: "Canonical",
    offer: "UbuntuServer",
    sku: "20.04-LTS",
    version: "latest"
}
// Creating the VM configuration object with the SKUID
const vmConfig = {
    imageReference: imgRef,
    nodeAgentSKUId: "batch.node.ubuntu 20.04"
};
// Number of VMs to create in a pool
const numVms = 4;

// Setting the VM size
const vmSize = "STANDARD_D1_V2";

Azure Batch 및 SKU ID에 사용할 수 있는 Linux VM 이미지 목록은 가상 머신 이미지 목록을 참조하세요.

풀 구성이 정의되면 Azure Batch 풀을 만들 수 있습니다. Batch 풀 명령은 Azure Virtual Machine 노드를 만들고, 실행할 작업을 수신할 수 있도록 노드를 준비합니다. 각 풀에는 후속 단계에서 참조할 고유 ID가 있어야 합니다.

다음은 Azure Batch 풀을 만드는 코드 조각입니다.

// Create a unique Azure Batch pool ID
const now = new Date();
const poolId = `processcsv_${now.getFullYear()}${now.getMonth()}${now.getDay()}${now.getHours()}${now.getSeconds()}`;

const poolConfig = {
    id: poolId,
    displayName: "Processing csv files",
    vmSize: vmSize,
    virtualMachineConfiguration: vmConfig,
    targetDedicatedNodes: numVms,
    enableAutoScale: false
};

// Creating the Pool
var pool = batchClient.pool.add(poolConfig, function (error, result){
    if(error!=null){console.log(error.response)};
});

생성된 풀의 상태를 확인하고, 해당 풀에 작업을 제출하여 계속 진행하기 전에 상태를 "활성"으로 만들 수 있습니다.

var cloudPool = batchClient.pool.get(poolId,function(error,result,request,response){
        if(error == null)
        {

            if(result.state == "active")
            {
                console.log("Pool is active");
            }
        }
        else
        {
            if(error.statusCode==404)
            {
                console.log("Pool not found yet returned 404...");

            }
            else
            {
                console.log("Error occurred while retrieving pool data");
            }
        }
        });

다음은 pool.get 함수에서 반환하는 샘플 결과 개체입니다.

{
  id: 'processcsv_2022002321',
  displayName: 'Processing csv files',
  url: 'https://<batch-account-name>.westus.batch.azure.com/pools/processcsv_2022002321',
  eTag: '0x8D9D4088BC56FA1',
  lastModified: 2022-01-10T07:12:21.943Z,
  creationTime: 2022-01-10T07:12:21.943Z,
  state: 'active',
  stateTransitionTime: 2022-01-10T07:12:21.943Z,
  allocationState: 'steady',
  allocationStateTransitionTime: 2022-01-10T07:13:35.103Z,
  vmSize: 'standard_d1_v2',
  virtualMachineConfiguration: {
    imageReference: {
      publisher: 'Canonical',
      offer: 'UbuntuServer',
      sku: '20.04-LTS',
      version: 'latest'
    },
    nodeAgentSKUId: 'batch.node.ubuntu 20.04'
  },
  resizeTimeout: 'PT15M',
  currentDedicatedNodes: 4,
  currentLowPriorityNodes: 0,
  targetDedicatedNodes: 4,
  targetLowPriorityNodes: 0,
  enableAutoScale: false,
  enableInterNodeCommunication: false,
  taskSlotsPerNode: 1,
  taskSchedulingPolicy: { nodeFillType: 'Spread' }}

4단계: Azure Batch 작업 제출

Azure Batch 작업은 유사한 작업의 논리적 그룹입니다. 이 시나리오에서는 "csv를 JSON으로 처리"입니다. 여기에서 각 작업은 각 Azure Storage 컨테이너에 있는 csv 파일을 처리할 수 있습니다.

이러한 작업은 Azure Batch 서비스를 통해 병렬로 실행되어 여러 노드에 배포되고 조정됩니다.

taskSlotsPerNode 속성을 사용하여 단일 노드에서 동시에 실행할 수 있는 최대 작업 수를 지정할 수 있습니다.

준비 작업

생성된 VM 노드는 빈 Ubuntu 노드입니다. 필수 구성 요소로 프로그램 집합을 설치해야 하는 경우가 자주 있습니다. 일반적으로 Linux 노드의 경우 실제 작업이 실행되기 전에 필수 구성 요소를 설치하는 셸 스크립트를 사용할 수 있습니다. 그러나 프로그래밍 방식의 실행 파일일 수 있습니다.

이 예제의 셸 스크립트는 Python-pip 및 Python용 Azure Storage Blob SDK를 설치합니다.

Azure Storage 계정에 스크립트를 업로드하고 해당 스크립트에 액세스하는 SAS URI를 생성할 수 있습니다. Azure Storage JavaScript SDK를 사용하여 이 프로세스를 자동화할 수도 있습니다.

작업에 대한 준비 작업은 특정 작업을 실행해야 하는 VM 노드에서만 실행됩니다. 노드에서 실행되는 태스크와 관계없이 모든 노드에 필수 구성 요소를 설치하도록 하려면 풀을 추가하는 동안 startTask 속성을 사용하면 됩니다. 다음 준비 작업 정의를 참조에 사용할 수 있습니다.

준비 작업은 Azure Batch 작업이 제출되는 동안 지정됩니다. 다음은 구성 가능한 준비 작업 매개 변수입니다.

  • ID: 준비 작업의 고유 식별자
  • commandLine: 작업 실행 파일을 실행하는 명령줄
  • resourceFiles: 이 작업을 실행하려면 다운로드해야 하는 파일의 세부 정보를 제공하는 개체 배열. 다음은 해당 옵션입니다.
    • httpUrl: 다운로드할 파일의 URL
    • filePath: 파일을 다운로드하여 저장할 로컬 경로
    • fileMode: Linux 노드에만 적용되는 fileMode는 8진수 형식이며 기본값은 0770
  • waitForSuccess: true로 설정하면 준비 작업이 실패할 경우 작업이 실행되지 않음
  • runElevated: 작업을 실행하려면 상승된 권한이 필요한 경우 true로 설정.

다음 코드 조각은 준비 작업 스크립트 구성 샘플을 보여 줍니다.

var jobPrepTaskConfig = {id:"installprereq",commandLine:"sudo sh startup_prereq.sh > startup.log",resourceFiles: [{ 'httpUrl': 'Blob sh url', 'filePath': 'startup_prereq.sh' }],waitForSuccess:true,runElevated:true, userIdentity: {autoUser: {elevationLevel: "admin", scope: "pool"}}}

작업을 실행하기 위해 설치해야 할 필수 구성 요소가 없는 경우 준비 작업을 건너뛸 수 있습니다. 다음 코드는 표시 이름이 "csv 파일 처리"인 작업을 만듭니다.

// Setting Batch Pool ID
const poolInfo = { poolId: poolId };
// Batch job configuration object
const jobId = "processcsvjob";
const jobConfig = {
    id: jobId,
    displayName: "process csv files",
    jobPreparationTask: jobPrepTaskConfig,
    poolInfo: poolInfo
};
// Adding Azure batch job to the pool
const job = batchClient.job.add(jobConfig, function (error, result) {
        if (error !== null) {
            console.log("An error occurred while creating the job...");
            console.log(error.response);
        }
    }
);

5단계: 작업에 대한 Azure Batch 작업 제출

csv 처리 작업을 만들었으니, 해당 작업에 대한 작업을 만들겠습니다. 컨테이너가 4개 있다고 가정하고, 각 컨테이너에 하나씩 총 4개의 작업을 만들어야 합니다.

Python 스크립트를 살펴보면, 두 개의 매개 변수가 허용됩니다.

  • 컨테이너 이름: 파일을 다운로드할 Storage 컨테이너
  • 패턴: 파일 이름 패턴의 선택적 매개 변수

"con1", "con2", "con3", "con4" 총 4개의 컨테이너가 있다고 가정할 때, 다음 코드는 앞에서 만든 Azure Batch 작업 "csv 처리"에 작업을 제출하는 방법을 보여 줍니다.

// storing container names in an array
const containerList = ["con1", "con2", "con3", "con4"];      //Replace with list of blob containers within storage account
containerList.forEach(function (val, index) {
    console.log("Submitting task for container : " + val);
    const containerName = val;
    const taskID = containerName + "_process";
    // Task configuration object
    const taskConfig = {
        id: taskID,
        displayName: 'process csv in ' + containerName,
        commandLine: 'python processcsv.py --container ' + containerName,
        resourceFiles: [{ 'httpUrl': 'Blob script url', 'filePath': 'processcsv.py' }]
    };

    const task = batchClient.task.add(jobId, taskConfig, function (error, result) {
        if (error !== null) {
            console.log("Error occurred while creating task for container " + containerName + ". Details : " + error.response);
        }
        else {
            console.log("Task for container : " + containerName + " submitted successfully");
        }
    });
});

이 코드는 풀에 여러 작업을 추가합니다. 각 작업은 앞에서 만든 VM의 풀에 있는 노드에서 실행됩니다. 작업 수가 풀의 VM 수 또는 taskSlotsPerNode 속성을 초과할 경우 노드를 사용할 수 있게 될 때까지 작업이 대기합니다. 이 오케스트레이션은 Azure Batch에서 자동으로 처리됩니다.

포털에 가면 구체적인 작업 상태 보기가 있습니다. Azure JavaScript SDK에서 목록을 사용하여 함수를 가져올 수도 있습니다. 자세한 내용은 설명서 링크에 제공됩니다.

다음 단계