快速入門:使用 Python 建立 Batch 並執行作業

此快速入門說明如何執行使用 適用於 Python 的 Azure Batch 程式庫之應用程式來開始使用 Azure Batch。 Python 應用程式:

  • 將數個輸入資料檔上傳至 Azure 儲存體 Blob 容器,以用於 Batch 工作處理。
  • 建立一個包含兩部虛擬機器 (VM) (或稱計算節點) 並執行 Ubuntu 20.04 LTS OS 的集區。
  • 建立一個作業和三項工作以在節點上執行。 每項工作會使用 Bash Shell 命令列處理其中一個輸入檔。
  • 顯示工作傳回的輸出檔案。

完成本快速入門之後,您將了解 Batch 服務的重要概念,並準備好搭配更實際、更大規模的工作負載使用 Batch。

必要條件

執行應用程式

若要完成本快速入門,您可以下載或複製 Python 應用程式、提供您的帳戶值、執行應用程式,以及確認輸出。

下載或複製應用程式

  1. 從 GitHub 下載或複製 Azure Batch Python Quickstart (英文) 應用程式。 使用下列命令以 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 和儲存體帳戶名稱、帳戶金鑰值和 Batch 帳戶端點。 您可以從 Azure 入口網站、Azure API 或命令列工具取得此資訊。

Azure 入口網站 取得您的帳戶資訊:

  1. 從 Azure 搜尋服務列中搜尋並選取您的 Batch 帳戶名稱。
  2. 在您的 Batch 帳戶頁面上,從左側導覽中選取 [金鑰]
  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>'

重要

不建議在應用程式來源中公開帳戶金鑰供實際執行使用。 您應該限制認證的存取,並使用變數或組態檔在程式碼中參考認證。 最好將 Batch 和儲存體帳戶金鑰儲存在 Azure Key Vault 中。

執行應用程式並檢視輸出

執行應用程式以檢視 Batch 工作流程的運作情形。

python python_quickstart_client.py

一般執行時間大約為三分鐘。 初始集區節點設定佔用大部分的時間。

應用程式會傳回類似以下範例的輸出:

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 入口網站中的 Batch 帳戶頁面監視節點、工作和作業狀態。

每個工作完成之後,您會看到類似以下範例的輸出:

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 Quickstart (英文) 中的步驟。

建立服務用戶端並上傳資源檔

  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 ResourceFile 物件,Batch 之後可將這類物件下載到計算節點。

    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. 應用程式會建立 BatchServiceClient 物件,以在 Batch 帳號中建立和管理集區、作業和工作。 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 物件會指定 ImageReference 參考 Ubuntu Server 20.04 LTS Azure Marketplace 映像。 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 殼層 cat 命令來處理輸入 resource_files 物件,以顯示文字檔。 然後,應用程式會使用 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 入口網站中的資源群組頁面頂端,選取 [刪除資源群組]。 在 [刪除資源群組] 畫面上,輸入資源群組名稱,然後選取 [刪除]

下一步

在本快速入門中,您執行了使用 Batch Python API 的應用程式建立 Batch 集區、節點、作業和工作。 作業將資源檔上傳至儲存體容器、在節點上執行工作,以及顯示節點的輸出。

您現在了解 Batch 服務的重要概念,可準備搭配更多真實的大規模工作負載來使用 Batch。 若要深入了解 Azure Batch,並使用真實的應用程式來逐步進行平行工作負載,請繼續進行 Batch Python 教學課程。