本快速入門示範如何執行使用 適用於 Python 的 Azure Batch 程式庫的應用程式來開始使用 Azure Batch。 Python 應用程式:
- 將數個輸入資料檔案上傳至 Azure 儲存體 Blob 容器,以用於 Batch 工作處理。
- 建立兩個虛擬機器 (VM) 或計算節點的集區,執行 Ubuntu 22.04 LTS 作業系統。
- 建立一個作業和三項工作以在節點上執行。 每個工作都會使用 Bash shell 命令列來處理其中一個輸入檔案。
- 顯示工作傳回的輸出檔案。
完成本快速入門之後,您將了解 Batch 服務的重要概念,並準備好搭配更實際、更大規模的工作負載使用 Batch。
先決條件
具有有效訂閱的 Azure 帳戶。 如果您沒有帳戶,可免費建立帳戶。
具有連結 Azure 儲存體帳戶的 Batch 帳戶。 您可以使用下列任一方法來建立帳戶: Azure CLI | Azure 入口網站 | Bicep | ARM 範本 | Terraform。
執行應用程式
若要完成本快速入門,請下載或複製 Python 應用程式、提供您的帳戶值、執行應用程式,並驗證輸出。
下載或複製應用程式
從 GitHub 下載或複製 Azure Batch Python 快速入門 應用程式。 使用下列命令,使用 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 帳戶頁面上,從左側導覽中選取 [金鑰]。
- 在 [ 索引鍵 ] 頁面上,複製下列值:
- 批次帳戶
- 帳戶端點
- 主要存取金鑰
- 儲存體帳戶名稱
- 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 金鑰保存庫中。
執行應用程式並檢視輸出
執行應用程式以查看 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 快速入門中的步驟。
建立服務用戶端並上傳資源檔案
應用程式會建立 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 22.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="22_04-lts",
version="latest"
),
node_agent_sku_id="batch.node.ubuntu 22.04"),
vm_size=config.POOL_VM_SIZE,
target_dedicated_nodes=config.POOL_NODE_COUNT
)
batch_service_client.pool.add(new_pool)
建立批次作業
批次工作是一或多個工作的邏輯群組。 作業包含工作通用的設定,例如優先順序以及要執行工作的集區。
應用程式會使用 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 shell 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 入口網站中,選取資源群組頁面頂端的 [刪除資源群組 ]。 在 [刪除資源群組] 畫面上,輸入資源群組名稱,然後選取 [刪除]。
後續步驟
在本快速入門中,您執行了使用 Batch Python API 來建立 Batch 集區、節點、作業和工作的應用程式。 工作會將資源檔案上傳至儲存容器、在節點上執行工作、並顯示節點的輸出。
您現在已了解 Batch 服務的重要概念,即可準備搭配更多真實的大規模工作負載來使用 Batch。 若要深入瞭解 Azure Batch,並逐步探索實際應用程式的平行工作負載,請繼續進行使用 Python 的 Batch 教學課程。