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

이 빠른 시작에서는 Python용 Azure Batch 라이브러리를 사용하는 앱을 실행하여 Azure Batch를 시작하는 방법을 보여 줍니다. Python 앱:

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

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

필수 조건

앱 실행

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

앱 다운로드 또는 복제

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

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. batch-python-quickstart/src 폴더로 전환하고 pip를 사용하여 필요한 패키지를 설치합니다.

    pip install -r requirements.txt
    

계정 정보를 제공합니다

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

Azure Portal에서 계정 정보를 가져오려면:

  1. Azure Search 창에서 배치 계정 이름을 검색하고 선택합니다.
  2. 배치 계정 페이지의 왼쪽 탐색 메뉴에서 를 선택합니다.
  3. 페이지에서 다음 값을 복사합니다.
  • Batch 계정
  • 계정 엔드포인트
  • 기본 액세스 키
  • 스토리지 계정 이름
  • Key1

다운로드한 Python 앱에서 복사한 값을 제공하려면 config.py 파일에서 다음 문자열을 편집합니다.

BATCH_ACCOUNT_NAME = '<batch account>'
BATCH_ACCOUNT_KEY = '<primary access key>'
BATCH_ACCOUNT_URL = '<account endpoint>'
STORAGE_ACCOUNT_NAME = '<storage account name>'
STORAGE_ACCOUNT_KEY = '<key1>'

Important

프로덕션 용도로 앱 원본에 계정 키를 노출하지 않는 것이 좋습니다. 자격 증명에 대한 액세스를 제한하고 변수나 구성 파일을 사용하여 코드에서 이를 참조해야 합니다. Azure Key Vault에 Batch 및 스토리지 계정 키를 저장하는 것이 가장 좋습니다.

앱 실행 및 출력 보기

작업에서 Batch 워크플로를 보려면 앱을 실행합니다.

python python_quickstart_client.py

일반적인 런타임은 약 3분입니다. 초기 풀 노드 설정에 가장 많은 시간이 걸립니다.

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

Sample start: 11/26/2012 4:02:54 PM

Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [PythonQuickstartPool]...
Creating job [PythonQuickstartJob]...
Adding 3 tasks to job [PythonQuickstartJob]...
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의 배치 계정 페이지에서 노드, 작업 및 작업 상태를 모니터링할 수 있습니다.

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

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

코드 검토

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

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

  1. 스토리지 계정과 상호 작용하기 위해 앱은 BlobServiceClient 개체를 만듭니다.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. 앱은 blob_service_client 참조를 사용하여 스토리지 계정에 컨테이너를 만들고, 데이터 파일을 이 컨테이너에 업로드합니다. 스토리지의 파일은 Batch가 나중에 컴퓨팅 노드에 다운로드할 수 있는 Batch ResourceFile 개체로 정의됩니다.

    input_file_paths = [os.path.join(sys.path[0], 'taskdata0.txt'),
                        os.path.join(sys.path[0], 'taskdata1.txt'),
                        os.path.join(sys.path[0], 'taskdata2.txt')]
    
    input_files = [
        upload_file_to_container(blob_service_client, input_container_name, file_path)
        for file_path in input_file_paths]
    
  3. 이 앱은 Batch 계정에서 풀, 작업 및 태스크를 만들고 관리하는 BatchServiceClient 개체를 만듭니다. Batch 클라이언트는 공유 키 인증을 사용합니다. Batch는 Microsoft Entra 인증도 지원합니다.

    credentials = SharedKeyCredentials(config.BATCH_ACCOUNT_NAME,
            config.BATCH_ACCOUNT_KEY)
    
        batch_client = BatchServiceClient(
            credentials,
            batch_url=config.BATCH_ACCOUNT_URL)
    

컴퓨팅 노드 풀 만들기

Batch 풀을 만들려면 앱에서 PoolAddParameter 클래스를 사용하여 노드 수, VM 크기 및 풀 구성을 설정합니다. 다음 VirtualMachineConfiguration 개체는 Ubuntu Server 20.04 LTS Azure Marketplace 이미지에 대한 ImageReference를 지정합니다. Batch는 광범위한 Linux 및 Windows Server Marketplace 이미지를 지원하며 사용자 지정 VM 이미지도 지원합니다.

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

pool.add 메서드는 풀을 Batch 서비스에 제출합니다.

new_pool = batchmodels.PoolAddParameter(
        id=pool_id,
        virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
            image_reference=batchmodels.ImageReference(
                publisher="canonical",
                offer="0001-com-ubuntu-server-focal",
                sku="20_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 20.04"),
        vm_size=config.POOL_VM_SIZE,
        target_dedicated_nodes=config.POOL_NODE_COUNT
    )
    batch_service_client.pool.add(new_pool)

Batch 작업 만들기

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

앱에서 JobAddParameter 클래스를 사용하여 풀에 작업을 만듭니다. job.add 메서드는 지정된 Batch 계정에 작업을 추가합니다. 처음에는 작업에 태스크가 없습니다.

job = batchmodels.JobAddParameter(
    id=job_id,
    pool_info=batchmodels.PoolInformation(pool_id=pool_id))

batch_service_client.job.add(job)

작업 만들기

Batch는 컴퓨팅 노드에 앱과 스크립트를 배포하는 여러 가지 방법을 제공합니다. 이 앱은 TaskAddParameter 클래스를 사용하여 태스크 개체의 목록을 만듭니다. 각 태스크는 command_line 매개 변수를 사용해 입력 파일을 처리하여 앱 또는 스크립트를 지정합니다.

다음 스크립트는 Bash 셸 resource_files 명령을 실행해 입력 cat 개체를 처리하여 텍스트 파일을 표시합니다. 그런 다음 앱은 task.add_collection 메서드를 사용하여 각 태스크를 작업에 추가합니다. 그러면 컴퓨팅 노드에서 실행할 태스크가 큐에 추가됩니다.

tasks = []

for idx, input_file in enumerate(resource_input_files):
    command = f"/bin/bash -c \"cat {input_file.file_path}\""
    tasks.append(batchmodels.TaskAddParameter(
        id=f'Task{idx}',
        command_line=command,
        resource_files=[input_file]
    )
    )

batch_service_client.task.add_collection(job_id, tasks)

태스크 출력 보기

앱에서 태스크 상태를 모니터링하여 태스크가 완료되었는지 확인합니다. 각 태스크가 성공적으로 실행되면 태스크 명령 출력이 stdout.txt 파일에 작성됩니다. 그러면 앱은 완료된 각 태스크에 대한 stdout.txt 파일을 표시합니다.

tasks = batch_service_client.task.list(job_id)

for task in tasks:

    node_id = batch_service_client.task.get(job_id, task.id).node_info.node_id
    print(f"Task: {task.id}")
    print(f"Node: {node_id}")

    stream = batch_service_client.file.get_from_task(
        job_id, task.id, config.STANDARD_OUT_FILE_NAME)

    file_text = _read_stream_as_string(
        stream,
        text_encoding)

    if text_encoding is None:
        text_encoding = DEFAULT_ENCODING

    sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = text_encoding)
    sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = text_encoding)

    print("Standard output:")
    print(file_text)

리소스 정리

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

Batch 리소스가 더 이상 필요하지 않으면 이를 포함하는 리소스 그룹을 삭제할 수 있습니다. Azure Portal의 리소스 그룹 페이지 상단에서 리소스 그룹 삭제를 선택합니다. 리소스 그룹 삭제 화면에서 리소스 그룹 이름을 입력한 후 삭제를 선택합니다.

다음 단계

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

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