快速入門:使用 Python 建立 Batch 並執行作業
此快速入門說明如何執行使用 適用於 Python 的 Azure Batch 程式庫之應用程式來開始使用 Azure Batch。 Python 應用程式:
- 將數個輸入資料檔上傳至 Azure 儲存體 Blob 容器,以用於 Batch 工作處理。
- 建立一個包含兩部虛擬機器 (VM) (或稱計算節點) 並執行 Ubuntu 20.04 LTS OS 的集區。
- 建立一個作業和三項工作以在節點上執行。 每項工作會使用 Bash Shell 命令列處理其中一個輸入檔。
- 顯示工作傳回的輸出檔案。
完成本快速入門之後,您將了解 Batch 服務的重要概念,並準備好搭配更實際、更大規模的工作負載使用 Batch。
必要條件
具有有效訂用帳戶的 Azure 帳戶。 如果您沒有帳戶,可免費建立帳戶。
Batch 帳戶和連結的 Azure 儲存體帳戶。 您可以使用下列其中一種方法建立帳戶:Azure CLI | Azure 入口網站 | Bicep | ARM 範本 | Terraform。
執行應用程式
若要完成本快速入門,您可以下載或複製 Python 應用程式、提供您的帳戶值、執行應用程式,以及確認輸出。
下載或複製應用程式
從 GitHub 下載或複製 Azure Batch Python Quickstart (英文) 應用程式。 使用下列命令以 Git 用戶端複製應用程式存放庫:
git clone https://github.com/Azure-Samples/batch-python-quickstart.git
切換至 [batch-python-quickstart/src] 資料夾,並使用
pip
安裝必要的套件。pip install -r requirements.txt
提供您的帳戶資訊
Python 應用程式必須使用您的 Batch 和儲存體帳戶名稱、帳戶金鑰值和 Batch 帳戶端點。 您可以從 Azure 入口網站、Azure API 或命令列工具取得此資訊。
從 Azure 入口網站 取得您的帳戶資訊:
- 從 Azure 搜尋服務列中搜尋並選取您的 Batch 帳戶名稱。
- 在您的 Batch 帳戶頁面上,從左側導覽中選取 [金鑰]。
- 在 [金鑰] 頁面上,複製下列值:
- 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 (英文) 中的步驟。
建立服務用戶端並上傳資源檔
應用程式會建立 BlobServiceClient 物件,以與儲存體帳戶互動。
blob_service_client = BlobServiceClient( account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/", credential=config.STORAGE_ACCOUNT_KEY )
應用程式會使用
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]
應用程式會建立 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_COUNT
和 POOL_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 教學課程。