このクイック スタートでは、Azure Batch .NET API を使用する C# アプリを実行して 、Azure Batch の使用を開始する方法について説明します。 .NET アプリ:
- Batch タスク処理に使用するために、複数の入力データ ファイルを Azure Storage BLOB コンテナーにアップロードします。
- Windows Server を実行する 2 つの仮想マシン (VM) またはコンピューティング ノードのプールを作成します。
- Windows コマンド ラインを使用して各入力ファイルを処理するタスクをノードで実行するジョブを作成します。
- タスクが返す出力ファイルを表示します。
このクイックスタートを完了すると、Batch サービスの主要な概念を理解し、より現実的でより大規模なワークロードで Batch を使用できるようになります。
前提条件
アクティブなサブスクリプションを持つ Azure アカウント。 お持ちでない場合は、無料のアカウントを作成してください。
Batch アカウントおよびリンクされた Azure Storage アカウント。 アカウントは、Azure CLI | Azure ポータル | Bicep | ARM テンプレート | Teraform のいずれかの方法を使用して作成できます。
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 portal、Azure API、またはコマンド ライン ツールから取得できます。
Azure portal からアカウント情報を取得するには:
- Azure の検索バーで、Batch アカウント名を検索して選択します。
- バッチ アカウント
- アカウント エンドポイント
- Storage account name (ストレージ アカウント名)
- サブスクリプション 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 portal の 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 Storage BLOB クライアント ライブラリを使用して BlobServiceClient を作成します。
string blobUri = "https://" + storageAccountName + ".blob.core.windows.net"; var blobServiceClient = new BlobServiceClient(new Uri(blobUri), new DefaultAzureCredential()); return blobServiceClient;アプリでは、
blobServiceClient参照を使用してストレージ アカウントにコンテナーを作成し、データ ファイルをコンテナーにアップロードします。 ストレージ内のファイルは、Batch が後でコンピューティング ノードにダウンロードできる Batch ResourceFile オブジェクトとして定義されます。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)); }アプリは、Batch ジョブとタスクを作成および管理するために、Azure.Compute.Batch ライブラリから BatchClient オブジェクトを作成します。 Batch クライアントは、Microsoft Entra認証を使用します。
BatchClient batchClient = new BatchClient(new Uri(BatchAccountUrl), new DefaultAzureCredential()); ...このアプリでは、Batch アカウントとそのプールを管理するために、Azure.ResourceManager.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 オブジェクトは、Windows Server Marketplace イメージへのBatchImageReferenceを指定します。 Batch では、さまざまな Windows Server および Linux Marketplace 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);
Batch ジョブを作成する
Batch ジョブは、1 つ以上のタスクを論理的にグループ化したものです。 ジョブには、優先度やタスクの実行対象プールなど、タスクに共通する設定が含まれています。
アプリでは、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 portal で、リソース グループ ページの上部にある [ リソース グループの削除 ] を選択します。 [ リソース グループの削除 ] 画面で、リソース グループ名を入力し、[削除] を選択 します。
次のステップ
このクイック スタートでは、Batch .NET API を使用して Batch プール、ノード、ジョブ、タスクを作成するアプリを実行しました。 ジョブは、リソース ファイルをストレージ コンテナーにアップロードし、ノードでタスクを実行し、ノードからの出力を表示しました。
Batch サービスの主要な概念を理解できたので、より現実的でより大規模なワークロードで Batch を使用する準備ができました。 Azure Batch の詳細を確認し、実際のアプリケーションで並列ワークロードを実行するには、Batch .NET チュートリアルに進んでください。