次の方法で共有


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

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

  • Batch タスク処理に使用するために、複数の入力データ ファイルを Azure Storage BLOB コンテナーにアップロードします。
  • Windows Server を実行する 2 つの仮想マシン (VM) またはコンピューティング ノードのプールを作成します。
  • 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. [キー] ページで、次の値をコピーします。
  • バッチ アカウント
  • アカウント エンドポイント
  • プライマリ アクセス キー
  • 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 build コマンドと dotnet 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 が後でコンピューティング ノードにダウンロードできる 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));
    }
    
  3. アプリは、Batch プール、ジョブ、タスクを作成および管理するための BatchClient オブジェクトを作成します。 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は、定義された定数です。 アプリは、2 つの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 ジョブは、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 チュートリアルに進んでください。