Szybki start: tworzenie puli usługi Batch i uruchamianie zadania przy użyciu języka Python

W tym przewodniku Szybki start pokazano, jak rozpocząć pracę z usługą Azure Batch, uruchamiając aplikację korzystającą z bibliotek usługi Azure Batch dla języka Python. Aplikacja w języku Python:

  • Przekazuje kilka plików danych wejściowych do kontenera obiektów blob usługi Azure Storage do użycia na potrzeby przetwarzania zadań usługi Batch.
  • Tworzy pulę dwóch maszyn wirtualnych lub węzłów obliczeniowych z systemem operacyjnym Ubuntu 20.04 LTS.
  • Tworzy zadanie i trzy zadania podrzędne do uruchomienia w tych węzłach. Każde zadanie przetwarza jeden z plików wejściowych przy użyciu wiersza polecenia powłoki Bash.
  • Wyświetla pliki wyjściowe zwracane przez zadania.

Po ukończeniu tego przewodnika Szybki start zapoznasz się z kluczowymi pojęciami usługi Batch i możesz przystąpić do korzystania z usługi Batch z bardziej realistycznymi, większymi obciążeniami na dużą skalę.

Wymagania wstępne

Uruchom aplikację

Aby ukończyć ten przewodnik Szybki start, pobierz lub sklonujesz aplikację w języku Python, podaj wartości konta, uruchom aplikację i zweryfikuj dane wyjściowe.

Pobieranie lub klonowanie aplikacji

  1. Pobierz lub sklonuj aplikację Szybki start dla języka Python usługi Azure Batch z usługi GitHub. Użyj następującego polecenia, aby sklonować repozytorium aplikacji z klientem Git:

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. Przejdź do folderu batch-python-quickstart/src i zainstaluj wymagane pakiety przy użyciu polecenia pip.

    pip install -r requirements.txt
    

Podaj informacje o koncie

Aplikacja w języku Python musi używać nazw kont usługi Batch i magazynu, wartości kluczy konta i punktu końcowego konta usługi Batch. Te informacje można uzyskać z witryny Azure Portal, interfejsów API platformy Azure lub narzędzi wiersza polecenia.

Aby uzyskać informacje o koncie z witryny Azure Portal:

  1. Na pasku usługi Azure Search wyszukaj i wybierz nazwę konta usługi Batch.
  2. Na stronie Konto usługi Batch wybierz pozycję Klucze w obszarze nawigacji po lewej stronie.
  3. Na stronie Klucze skopiuj następujące wartości:
  • Konto usługi Batch
  • Punkt końcowy konta
  • Podstawowy klucz dostępu
  • Nazwa konta magazynu
  • Klucz1

W pobranej aplikacji języka Python zmodyfikuj następujące ciągi w pliku config.py , aby podać skopiowane wartości.

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>'

Ważne

Udostępnianie kluczy kont w źródle aplikacji nie jest zalecane w przypadku użycia produkcyjnego. Należy ograniczyć dostęp do poświadczeń i odwołać się do nich w kodzie przy użyciu zmiennych lub pliku konfiguracji. Najlepiej przechowywać klucze kont usługi Batch i magazynu w usłudze Azure Key Vault.

Uruchamianie aplikacji i wyświetlanie danych wyjściowych

Uruchom aplikację, aby zobaczyć przepływ pracy usługi Batch w akcji.

python python_quickstart_client.py

Typowy czas wykonywania wynosi około trzech minut. Konfiguracja początkowego węzła puli zajmuje jak najwięcej czasu.

Aplikacja zwraca dane wyjściowe podobne do następującego przykładu:

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...

Podczas uruchamiania węzłów obliczeniowych puli jest wstrzymana Monitoring all tasks for 'Completed' state, timeout in 00:30:00... . W miarę tworzenia zadań usługa Batch kolejkuje je do uruchomienia w puli. Gdy tylko pierwszy węzeł obliczeniowy jest dostępny, pierwsze zadanie jest uruchamiane w węźle. Stan węzła, zadania i zadania można monitorować na stronie konta usługi Batch w witrynie Azure Portal.

Po zakończeniu każdego zadania zobaczysz dane wyjściowe podobne do następującego przykładu:

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...

Przeglądanie kodu

Zapoznaj się z kodem, aby poznać kroki opisane w przewodniku Szybki start dla języka Python w usłudze Azure Batch.

Tworzenie klientów usługi i przekazywanie plików zasobów

  1. Aplikacja tworzy obiekt BlobServiceClient w celu interakcji z kontem magazynu.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. Aplikacja używa blob_service_client odwołania do tworzenia kontenera na koncie magazynu i przekazywania plików danych do kontenera. Pliki w magazynie są definiowane jako obiekty ResourceFile usługi Batch, które następnie mogą być pobierane przez tę usługę do węzłów obliczeniowych.

    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. Aplikacja tworzy obiekt BatchServiceClient w celu tworzenia pul, zadań i zadań podrzędnych na koncie usługi Batch oraz zarządzania nimi. Klient usługi Batch używa uwierzytelniania klucza współużytkowanego. Usługa Batch obsługuje również uwierzytelnianie firmy Microsoft Entra.

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

Tworzenie puli węzłów obliczeniowych

Aby utworzyć pulę usługi Batch, aplikacja używa klasy PoolAddParameter do ustawiania liczby węzłów, rozmiaru maszyny wirtualnej i konfiguracji puli. Poniższy obiekt VirtualMachineConfiguration określa obraz ImageReference do obrazu z systemem Ubuntu Server 20.04 LTS w witrynie Azure Marketplace. Usługa Batch obsługuje szeroką gamę obrazów z witryny Marketplace systemów Linux i Windows Server, a także obsługuje niestandardowe obrazy maszyn wirtualnych.

Wartości POOL_NODE_COUNT i POOL_VM_SIZE są zdefiniowanymi stałymi. Aplikacja tworzy pulę dwóch węzłów o rozmiarze Standard_DS1_v2. Ten rozmiar zapewnia dobrą równowagę między wydajnością a kosztami dla tego przewodnika Szybki start.

Metoda pool.add przesyła pulę do usługi 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)

Utworzenie zadania usługi Batch

Zadanie usługi Batch to logiczna grupa zawierająca co najmniej jedno zadanie podrzędne. Zadanie zawiera ustawienia wspólne dla zadań, takich jak priorytet i pula do uruchamiania zadań podrzędnych.

Aplikacja używa klasy JobAddParameter do utworzenia zadania w puli. Metoda job.add dodaje zadanie do określonego konta usługi Batch. Początkowo zadanie nie zawiera zadań podrzędnych.

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

batch_service_client.job.add(job)

Tworzenie zadań

Usługa Batch udostępnia kilka sposobów wdrażania aplikacji i skryptów w węzłach obliczeniowych. Ta aplikacja tworzy listę obiektów zadań przy użyciu klasy TaskAddParameter . Każde zadanie przetwarza plik wejściowy przy użyciu parametru command_line w celu określenia aplikacji lub skryptu.

Poniższy skrypt przetwarza obiekty wejściowe resource_files , uruchamiając polecenie powłoki cat Bash w celu wyświetlenia plików tekstowych. Następnie aplikacja używa metody task.add_collection , aby dodać każde zadanie do zadania, co powoduje kolejkę zadań do uruchomienia w węzłach obliczeniowych.

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)

Wyświetlanie danych wyjściowych zadania podrzędnego

Aplikacja monitoruje stan zadań podrzędnych, aby upewnić się, że zostaną one ukończone. Po pomyślnym uruchomieniu każdego zadania dane wyjściowe polecenia zadania są zapisywane w pliku stdout.txt . Następnie aplikacja wyświetla plik stdout.txt dla każdego ukończonego zadania.

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)

Czyszczenie zasobów

Aplikacja automatycznie usuwa utworzony kontener magazynu, a także udostępnia opcję usunięcia puli i zadania usługi Batch. Pule i węzły są naliczane opłaty, gdy węzły są uruchomione, nawet jeśli nie są uruchomione zadania. Jeśli pula nie jest już potrzebna, usuń ją.

Gdy zasoby usługi Batch nie są już potrzebne, możesz usunąć grupę zasobów, która je zawiera. W witrynie Azure Portal wybierz pozycję Usuń grupę zasobów w górnej części strony grupy zasobów. Na ekranie Usuwanie grupy zasobów wprowadź nazwę grupy zasobów, a następnie wybierz pozycję Usuń.

Następne kroki

W tym przewodniku Szybki start uruchomiono aplikację, która używa interfejsu API języka Python usługi Batch do tworzenia puli, węzłów, zadań i zadań usługi Batch. Zadanie przesłało pliki zasobów do kontenera magazynu, uruchamiało zadania w węzłach i wyświetlało dane wyjściowe z węzłów.

Teraz, gdy rozumiesz kluczowe pojęcia usługi Batch, możesz przystąpić do korzystania z usługi Batch z bardziej realistycznymi, większymi obciążeniami na dużą skalę. Aby dowiedzieć się więcej na temat usługi Azure Batch i zapoznać się z równoległym obciążeniem za pomocą rzeczywistej aplikacji, przejdź do samouczka dotyczącego języka Python usługi Batch.