快速入門:使用 .NET 來建立 Batch 集區並執行作業

此快速入門說明如何執行使用 Azure Batch .NET API 的 C# 應用程式來開始使用 Azure Batch。 .NET 應用程式會:

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

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

必要條件

執行應用程式

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

下載或複製應用程式

從 GitHub 下載或複製 Azure Batch .NET Quickstart 應用程式。 使用下列命令以 Git 用戶端複製應用程式存放庫:

git clone https://github.com/Azure-Samples/batch-dotnet-quickstart.git

提供您的帳戶資訊

應用程式必須使用您的 Batch 和儲存體帳戶名稱、帳戶金鑰值和 Batch 帳戶端點。 您可以從 Azure 入口網站、Azure API 或命令列工具取得此資訊。

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

  1. 從 Azure 搜尋服務列中搜尋並選取您的 Batch 帳戶名稱。
  2. 在您的 Batch 帳戶頁面上,從左側導覽中選取 [金鑰]
  3. 在 [金鑰] 頁面上,複製下列值:
  • 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 builddotnet run 命令。

在 Visual Studio 中:

  1. 開啟 BatchDotNetQuickstart.sln 檔案,在 [方案總管] 中以右鍵按一下方案,然後選取 [建置]。 如果出現提示,請使用 NuGet 套件管理員更新或還原 NuGet 套件。

  2. 建置完成後,請選取頂端功能表列中的 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 中的步驟。

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

  1. 為了與儲存體帳戶進行互動,應用程式會使用適用於 .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;
    
  2. 應用程式會使用 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));
    }
    
  3. 應用程式會建立 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 教學課程。