本快速入门演示了如何通过运行一个使用 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 快速入门应用。 若要使用 Git 客户端克隆应用存储库,请使用以下命令:
git clone https://github.com/Azure-Samples/batch-dotnet-quickstart.git
提供帐户信息
该应用需要使用 Batch 和存储帐户名称、帐户密钥值以及 Batch 帐户终结点。 你可以通过 Azure 门户、Azure API 或命令行工具获取这些信息。
若要从 Azure 门户获取帐户信息,请执行以下操作:
- 在 Azure 搜索栏中,搜索并选择你的 Batch 帐户名称。
- Batch 帐户
- 帐户终结点
- 存储帐户名称
- 订阅 ID
- 资源组名称
导航到所下载的 batch-dotnet-quickstart 文件夹,并在 Program.cs 中编辑凭据字符串,以提供复制的值:
// Batch account credentials
const string BatchAccountName = "<batch account>";
const string BatchAccountUrl = "<account endpoint>";
// Azure Resource Manager credentials for the Batch account
const string SubscriptionId = "<subscription ID>";
const string ResourceGroupName = "<resource group name>";
// Storage account credentials
const string StorageAccountName = "<storage account name>";
构建和运行应用并查看输出内容
若要 Batch 工作流的操作情况,请在 Visual Studio 中构建并运行应用程序。 还可使用命令行 dotnet build 和 dotnet run 命令。
在 Visual Studio 中:
打开 BatchDotNetQuickstart.sln 文件,右键单击解决方案资源管理器中的解决方案,然后选择“生成”。 如果出现提示,请使用 NuGet 包管理器来更新或还原 NuGet 包。
生成完成后,在顶部菜单栏中选择 BatchDotNetQuickstart 来运行应用。
采用默认配置的典型运行时间约为 5 分钟。 初始池节点设置花费的时间最多。 若要重新运行作业,请从以前的运行中删除作业,但不要删除池。 在预配置的池中,该作业数秒即可完成。
该应用将返回类似于以下示例的输出:
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 快速入门中的步骤。
创建服务客户端并上传资源文件
为了与存储帐户交互,应用使用适用于 .NET 的 Azure 存储 Blob 客户端库来创建 BlobServiceClient。
string blobUri = "https://" + storageAccountName + ".blob.core.chinacloudapi.cn"; var blobServiceClient = new BlobServiceClient(new Uri(blobUri), new DefaultAzureCredential()); 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)); }应用程序使用 Azure.Compute.Batch 库创建一个 BatchClient 对象,用于创建和管理 Batch 作业和任务。 Batch 客户端使用Microsoft Entra身份验证。
BatchClient batchClient = new BatchClient(new Uri(BatchAccountUrl), new DefaultAzureCredential()); ...该应用还使用 Azure。ResourceManager.Batch 库来管理 Batch 帐户及其池。 它会创建一个 ArmClient,并通过订阅 ID、资源组名称和 Batch 帐户名称获取该 Batch 帐户的 BatchAccountResource 引用。
ArmClient armClient = new ArmClient(new DefaultAzureCredential()); ResourceIdentifier batchAccountIdentifier = BatchAccountResource.CreateResourceIdentifier( SubscriptionId, ResourceGroupName, BatchAccountName); BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountIdentifier);
创建计算节点池
若要创建 Batch 池,应用使用 BatchAccountPoolCollection.CreateOrUpdateAsync 方法设置节点数、VM 大小和池配置。 以下 BatchVmConfiguration 对象将BatchImageReference指定到Windows Server市场映像。 Batch 支持广泛的 Windows Server 和 Linux 市场 OS 映像,还支持自定义 VM 映像。
PoolNodeCount 和 VM 大小 PoolVMSize 是定义的常量。 该应用会创建一个由 2 个 Standard_A1_v2 节点组成的池。 对于本快速入门,此大小在性能和成本之间达成了很好的平衡。
BatchImageReference imageReference = new BatchImageReference()
{
Publisher = "MicrosoftWindowsServer",
Offer = "WindowsServer",
Sku = "2016-datacenter-smalldisk",
Version = "latest"
};
BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
imageReference: imageReference,
nodeAgentSkuId: "batch.node.windows amd64");
BatchAccountPoolData poolData = new BatchAccountPoolData()
{
VmSize = PoolVMSize,
DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
ScaleSettings = new BatchAccountPoolScaleSettings()
{
FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = PoolNodeCount }
}
};
await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, PoolId, poolData);
创建批处理任务
批处理作业是将一个或多个任务进行逻辑分组。 该作业包含任务的公用设置,例如优先级以及运行任务的池。
该应用使用 BatchClient.CreateJobAsync 在你的池中创建一个作业。 作业一开始没有任务。
BatchJobCreateOptions job = new BatchJobCreateOptions(JobId, new BatchPoolInfo() { PoolId = PoolId });
await batchClient.CreateJobAsync(job);
创建任务
Batch 提供了多种将应用和脚本部署到计算节点的方式。 此应用创建 BatchTaskCreateOptions 输入 ResourceFile 对象的列表。 每个任务通过使用 CommandLine 属性来处理输入文件。 可在 Batch 命令行中指定应用或脚本。
以下代码中的命令行运行 Windows type 命令来显示输入文件。 然后,应用使用 BatchClient.CreateTasksAsync 将这些任务添加到作业中,并将它们加入队列,以便在计算节点上运行。
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);
BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId, taskCommandLine)
{
ResourceFiles = { inputFiles[i] }
};
tasks.Add(task);
}
await batchClient.CreateTasksAsync(JobId, tasks);
查看任务输出
应用等待任务完成。 当每个任务成功运行时,其输出将写入 stdout.txt。 然后,应用使用 BatchTask.NodeInfo 属性显示每个已完成任务的 stdout.txt 文件。
await foreach (BatchTask task in batchClient.GetTasksAsync(JobId))
{
string nodeId = task.NodeInfo?.NodeId ?? "<unknown>";
Console.WriteLine("Task: {0}", task.Id);
Console.WriteLine("Node: {0}", nodeId);
Console.WriteLine("Standard out:");
BinaryData stdout = await batchClient.GetTaskFileAsync(JobId, task.Id, "stdout.txt");
Console.WriteLine(stdout.ToString());
}
清理资源
应用自动删除所创建的存储容器,并允许你选择是否删除 Batch 池和作业。 当节点运行时,池和节点会产生费用,即使它们没有运行作业。 不再需要相应池时,请将其删除。
不再需要 Batch 帐户和存储帐户时,可删除包含这些帐户的资源组。 在 Azure 门户,选择资源组页面顶部的“删除资源组”。 在“删除资源组”屏幕上,输入资源组名称,然后选择“删除”。
后续步骤
在本快速入门中,你运行了一个应用,该应用使用 Batch .NET API 来创建 Batch 池、节点、作业和任务。 作业将资源文件上传到存储容器,在节点上运行任务,并显示来自节点的输出。
现在你已经了解了 Batch 服务的关键概念,可以将 Batch 用于更现实、更大规模的工作负载了。 若要详细了解 Azure Batch 并使用实际的应用程序演练并行工作负载,请继续学习 Batch .NET 教程。