クイックスタート: .NET を使用して Batch プールを作成し、ジョブを実行する

このクイックスタートでは、Azure Batch .NET API を使用する C# アプリを実行して、Azure Batch の使用を開始する方法について説明します。 .NET アプリで以下を行います。

  • Batch タスク処理に使用するために、Azure Storage Blob コンテナーに複数の入力データ ファイルをアップロードします。
  • Windows Server を実行する 2 つの仮想マシン (VM) またはコンピューティング ノードのプールを 1 つ作成します。
  • Windows コマンド ラインを使用して各入力ファイルを処理するタスクをノードで実行するジョブを作成します。
  • タスクから返される出力ファイルを表示します。

このクイックスタートを完了すると、Batch サービスの主要な概念を理解し、より現実的でより大規模なワークロードで Batch を使用できるようになります。

前提条件

アプリを実行する

このクイックスタートを完了するには、アプリをダウンロードまたはクローンし、アカウントの値を指定し、アプリをビルドして実行し、出力を確認します。

アプリをダウンロードまたは複製する

GitHub から Azure Batch .NET クイック スタートのアプリをダウンロードまたはクローンします。 次のコマンドを使用して、Git クライアントでサンプル アプリ リポジトリを複製します。

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

アカウント情報を指定する

このアプリでは、Batch アカウントとストレージ アカウントの名前、アカウント キーの値、Batch アカウント エンドポイントを使用する必要があります。 この情報は、Azure portal、Azure API、またはコマンド ライン ツールから取得できます。

Azure portal からアカウント情報を取得するには:

  1. Azure の検索バーで、Batch アカウント名を検索して選択します。
  2. Batch アカウント ページで、左側のナビゲーションから [キー] を選択します。
  3. [キー] ページで、次の値をコピーします。
  • Batch アカウント
  • アカウント エンドポイント
  • プライマリ アクセス キー
  • Storage account name (ストレージ アカウント名)
  • 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 を選択してアプリを実行します。

既定の構成での一般的な実行時間は約 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 クイック スタートの手順を把握します。

サービス クライアントを作成してリソース ファイルをアップロードする

  1. ストレージ アカウントを操作するために、アプリでは .NET 用 Azure Storage 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 オブジェクトは、Windows Server Marketplace イメージに対する ImageReference を指定します。 Batch では、Windows Server および Linux のさまざまな Marketplace の OS イメージと、カスタム VM イメージもサポートされています。

PoolNodeCount および VM サイズ PoolVMSize は定義済みの定数です。 アプリは、Standard_A1_v2 の 2 つのノードで構成されるプールを作成します。 このクイックスタートにおいて、このサイズはパフォーマンスとコストのバランスが取れています。

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 ジョブは、1 つ以上のタスクの論理グループです。 ジョブには、優先度やタスクの実行対象プールなど、タスクに共通する設定が含まれています。

このアプリは、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 portal のリソース グループ ページの上部で、[リソース グループの削除] を選択します。 [リソース グループの削除] 画面で、リソース グループ名を入力し、[削除] を選択します。

次のステップ

このクイックスタートでは、Batch .NET API を使用して Batch プール、ノード、ジョブ、タスクを作成するアプリを実行しました。 ジョブによって、リソース ファイルがストレージ コンテナーにアップロードされ、ノードでタスクが実行され、ノードからの出力が表示されました。

Batch サービスの主要な概念を理解できたので、より現実的でより大規模なワークロードを使用して Batch を使用する準備が整いました。 Azure Batch の詳細を確認し、実際のアプリケーションで並列ワークロードを詳しく見てみるには、Batch .NET のチュートリアルに進んでください。