快速入門:使用 .NET 來建立 Batch 集區並執行作業
此快速入門說明如何執行使用 Azure Batch .NET API 的 C# 應用程式來開始使用 Azure Batch。 .NET 應用程式會:
- 將數個輸入資料檔上傳至 Azure 儲存體 Blob 容器,以用於 Batch 工作處理。
- 建立一個包含兩部虛擬機器 (VM) (或稱計算節點) 並執行 Windows Server 的集區。
- 使用 Windows 命令列建立在節點上執行工作的作業,以處理每個輸入檔。
- 顯示工作傳回的輸出檔案。
完成本快速入門之後,您將了解 Batch 服務的重要概念,並準備好搭配更實際、更大規模的工作負載使用 Batch。
必要條件
具有有效訂用帳戶的 Azure 帳戶。 如果您沒有帳戶,可免費建立帳戶。
Batch 帳戶和連結的 Azure 儲存體帳戶。 您可以使用下列其中一種方法建立帳戶:Azure CLI | Azure 入口網站 | Bicep | ARM 範本 | Terraform。
適用於 Linux 或 Windows 的 Visual Studio 2019 或更新版本,或 .NET 6.0 或更新版本。
執行應用程式
若要完成本快速入門,您可以下載或複製應用程式、提供您的帳戶值、建置並執行應用程式,以及確認輸出。
下載或複製應用程式
從 GitHub 下載或複製 Azure Batch .NET Quickstart 應用程式。 使用下列命令以 Git 用戶端複製應用程式存放庫:
git clone https://github.com/Azure-Samples/batch-dotnet-quickstart.git
提供您的帳戶資訊
應用程式必須使用您的 Batch 和儲存體帳戶名稱、帳戶金鑰值和 Batch 帳戶端點。 您可以從 Azure 入口網站、Azure API 或命令列工具取得此資訊。
從 Azure 入口網站 取得您的帳戶資訊:
- 從 Azure 搜尋服務列中搜尋並選取您的 Batch 帳戶名稱。
- 在您的 Batch 帳戶頁面上,從左側導覽中選取 [金鑰]。
- 在 [金鑰] 頁面上,複製下列值:
- Batch 帳戶
- 帳戶端點
- 主要存取金鑰
- 儲存體帳戶名稱
- Key1
瀏覽至您下載的 batch-dotnet-quickstart 資料夾,並編輯 Program.cs 中的認證字串,以提供您複製的值:
// Batch account credentials
private const string BatchAccountName = "<batch account>";
private const string BatchAccountKey = "<primary access key>";
private const string BatchAccountUrl = "<account endpoint>";
// Storage account credentials
private const string StorageAccountName = "<storage account name>";
private const string StorageAccountKey = "<key1>
重要
不建議在應用程式來源中公開帳戶金鑰供實際執行使用。 您應該限制認證的存取,並使用變數或組態檔在程式碼中參考認證。 最好將 Batch 和儲存體帳戶金鑰儲存在 Azure Key Vault 中。
建置並執行應用程式,以及檢視輸出
若要查看作用中的 Batch 工作流程,請在 Visual Studio 中建置並執行應用程式。 您也可以使用命令列 dotnet build
和 dotnet run
命令。
在 Visual Studio 中:
開啟 BatchDotNetQuickstart.sln 檔案,在 [方案總管] 中以右鍵按一下方案,然後選取 [建置]。 如果出現提示,請使用 NuGet 套件管理員更新或還原 NuGet 套件。
建置完成後,請選取頂端功能表列中的 BatchDotNetQuickstart 執行應用程式。
使用預設組態的一般執行時間大約是五分鐘。 初始集區節點設定佔用大部分的時間。 若要重新執行作業,請刪除上一次執行的作業,但不要刪除集區。 在預先設定的集區上,此作業會在幾秒內完成。
應用程式會傳回類似以下範例的輸出:
Sample start: 11/16/2022 4:02:54 PM
Container [input] created.
Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [DotNetQuickstartPool]...
Creating job [DotNetQuickstartJob]...
Adding 3 tasks to job [DotNetQuickstartJob]...
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 out:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...
stderr:
...
檢閱程式碼
請檢閱程式碼以了解 Azure Batch .NET Quickstart 中的步驟。
建立服務用戶端並上傳資源檔
為了與儲存體帳戶進行互動,應用程式會使用適用於 .NET 的 Azure 儲存體 Blob 用戶端程式庫建立 BlobServiceClient。
var sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey); string blobUri = "https://" + storageAccountName + ".blob.core.windows.net"; var blobServiceClient = new BlobServiceClient(new Uri(blobUri), sharedKeyCredential); return blobServiceClient;
應用程式會使用
blobServiceClient
參考在儲存體帳戶中建立容器,並將資料檔案上傳至該容器。 儲存體中的檔案會定義為 Batch ResourceFile 物件,Batch 之後可將這類物件下載到計算節點。List<string> inputFilePaths = new() { "taskdata0.txt", "taskdata1.txt", "taskdata2.txt" }; var inputFiles = new List<ResourceFile>(); foreach (var filePath in inputFilePaths) { inputFiles.Add(UploadFileToContainer(containerClient, inputContainerName, filePath)); }
應用程式會建立 BatchClient 物件,以建立和管理 Batch 集區、作業和工作。 Batch 用戶端會使用共用金鑰驗證。 Batch 也支援 Microsoft Entra 驗證。
var cred = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey); using BatchClient batchClient = BatchClient.Open(cred); ...
建立計算節點的集區
為了建立 Batch 集區,應用程式會使用 BatchClient.PoolOperations.CreatePool 方法來設定節點數目、VM 大小和集區設定。 下列 VirtualMachineConfiguration 物件會指定 ImageReference 參考 Windows Server Marketplace 映像。 Batch 支援各種不同的 Windows Server 和 Linux Marketplace OS 映像,也支援自訂 VM 映像。
PoolNodeCount
和 VM 大小 PoolVMSize
是定義的常數。 應用程式會建立一個包含兩個 Standard_A1_v2 節點的集區。 此大小可為此快速入門提供良好的效能與成本平衡。
Commit 方法會將集區提交至 Batch 服務。
private static VirtualMachineConfiguration CreateVirtualMachineConfiguration(ImageReference imageReference)
{
return new VirtualMachineConfiguration(
imageReference: imageReference,
nodeAgentSkuId: "batch.node.windows amd64");
}
private static ImageReference CreateImageReference()
{
return new ImageReference(
publisher: "MicrosoftWindowsServer",
offer: "WindowsServer",
sku: "2016-datacenter-smalldisk",
version: "latest");
}
private static void CreateBatchPool(BatchClient batchClient, VirtualMachineConfiguration vmConfiguration)
{
try
{
CloudPool pool = batchClient.PoolOperations.CreatePool(
poolId: PoolId,
targetDedicatedComputeNodes: PoolNodeCount,
virtualMachineSize: PoolVMSize,
virtualMachineConfiguration: vmConfiguration);
pool.Commit();
}
...
建立 Batch 作業
Batch 作業是一或多項工作的邏輯群組。 作業包含工作通用的設定,例如優先順序以及要執行工作的集區。
應用程式會使用 BatchClient.JobOperations.CreateJob 方法在您的集區上建立作業。 Commit 方法會將作業提交至 Batch 服務。 一開始作業沒有任何工作。
try
{
CloudJob job = batchClient.JobOperations.CreateJob();
job.Id = JobId;
job.PoolInformation = new PoolInformation { PoolId = PoolId };
job.Commit();
}
...
建立工作
Batch 提供幾種方法將應用程式和指令碼部署至計算節點。 此應用程式會建立一份 CloudTask 輸入 ResourceFile
物件的清單。 每項工作都會使用 CommandLine 屬性處理輸入檔。 Batch 命令列是您指定應用程式或指令碼的位置。
下列程式碼中的命令列會執行 Windows type
命令以顯示輸入檔。 然後,應用程式會使用 AddTask 方法將每個工作新增至作業,該方法會將工作排入佇列以在計算節點上執行。
for (int i = 0; i < inputFiles.Count; i++)
{
string taskId = String.Format("Task{0}", i);
string inputFilename = inputFiles[i].FilePath;
string taskCommandLine = String.Format("cmd /c type {0}", inputFilename);
var task = new CloudTask(taskId, taskCommandLine)
{
ResourceFiles = new List<ResourceFile> { inputFiles[i] }
};
tasks.Add(task);
}
batchClient.JobOperations.AddTask(JobId, tasks);
檢視工作輸出
應用程式會建立 TaskStateMonitor 來監視工作,並確保工作都已完成。 當每個工作順利執行時,其輸出會寫入至 stdout.txt。 應用程式接著會使用 CloudTask.ComputeNodeInformation 屬性顯示每項已完成工作的 stdout.txt 檔案。
foreach (CloudTask task in completedtasks)
{
string nodeId = String.Format(task.ComputeNodeInformation.ComputeNodeId);
Console.WriteLine("Task: {0}", task.Id);
Console.WriteLine("Node: {0}", nodeId);
Console.WriteLine("Standard out:");
Console.WriteLine(task.GetNodeFile(Constants.StandardOutFileName).ReadAsString());
}
清除資源
應用程式會自動刪除它所建立的儲存體容器,並且為您提供用於刪除 Batch 集區和工作的選項。 集區和節點會在節點執行時產生費用,即使節點未執行作業也一樣。 如果您不再需要集區,請將它刪除。
當您不再需要 Batch 帳戶和儲存體帳戶時,您可以刪除包含它們的資源群組。 在 Azure 入口網站中的資源群組頁面頂端,選取 [刪除資源群組]。 在 [刪除資源群組] 畫面上,輸入資源群組名稱,然後選取 [刪除]。
下一步
在本快速入門中,您執行了使用 Batch .NET API 的應用程式建立 Batch 集區、節點、作業和工作。 作業將資源檔上傳至儲存體容器、在節點上執行工作,以及顯示節點的輸出。
您現在了解 Batch 服務的重要概念,可準備搭配更多真實的大規模工作負載來使用 Batch。 若要深入了解 Azure Batch,並使用真實的應用程式來逐步進行平行工作負載,請繼續進行 Batch .NET 教學課程。