チュートリアル:.NET API を使用して Azure Batch で並列ワークロードを実行するTutorial: Run a parallel workload with Azure Batch using the .NET API

Azure Batch を使用すると、大規模な並列コンピューティングやハイパフォーマンス コンピューティング (HPC) のバッチ ジョブを Azure で効率的に実行することができます。Use Azure Batch to run large-scale parallel and high-performance computing (HPC) batch jobs efficiently in Azure. このチュートリアルでは、Batch を使用して並列ワークロードを実行する C# の例を紹介します。This tutorial walks through a C# example of running a parallel workload using Batch. 一般的な Batch アプリケーション ワークフローのほか、Batch および Storage のリソースをプログラムで操作する方法を学習します。You learn a common Batch application workflow and how to interact programmatically with Batch and Storage resources. 学習内容は次のとおりです。You learn how to:

  • アプリケーション パッケージを Batch アカウントに追加するAdd an application package to your Batch account
  • Batch アカウントおよびストレージ アカウントで認証するAuthenticate with Batch and Storage accounts
  • Storage に入力ファイルをアップロードするUpload input files to Storage
  • アプリケーションを実行するコンピューティング ノードのプールを作成するCreate a pool of compute nodes to run an application
  • 入力ファイルを処理するジョブとタスクを作成するCreate a job and tasks to process input files
  • タスクの実行を監視するMonitor task execution
  • 出力ファイルを取得するRetrieve output files

このチュートリアルでは、ffmpeg オープンソース ツールを使用して複数の MP4 メディア ファイルを並行して MP3 形式に変換します。In this tutorial, you convert MP4 media files in parallel to MP3 format using the ffmpeg open-source tool.

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

前提条件Prerequisites

  • Visual Studio 2017 以降、あるいは Linux、macOS、または Windows 用の .NET Core 2.1Visual Studio 2017 or later, or .NET Core 2.1 for Linux, macOS, or Windows.

  • Batch アカウントおよびリンクされた Azure ストレージ アカウント。A Batch account and a linked Azure Storage account. これらのアカウントを作成するには、Azure Portal または Azure CLI を使用した Batch のクイック スタートを参照してください。To create these accounts, see the Batch quickstarts using the Azure portal or Azure CLI.

  • Windows 64 ビット版の ffmpeg 3.4 (.zip)。Windows 64-bit version of ffmpeg 3.4 (.zip). この ZIP ファイルをローカル コンピューターにダウンロードします。Download the zip file to your local computer. このチュートリアルで必要なのは、この ZIP ファイルのみです。For this tutorial, you only need the zip file. ファイルを解凍したり、ローカルにインストールしたりする必要はありません。You do not need to unzip the file or install it locally.

Azure へのサインインSign in to Azure

Azure Portal https://portal.azure.com にサインインします。Sign in to the Azure portal at https://portal.azure.com.

アプリケーション パッケージの追加Add an application package

Azure Portal を使用して、ffmpeg をアプリケーション パッケージとして Batch アカウントに追加します。Use the Azure portal to add ffmpeg to your Batch account as an application package. アプリケーション パッケージは、タスク アプリケーションと、プール内のコンピューティング ノードへのそのアプリケーションのデプロイを管理する際に役立ちます。Application packages help you manage task applications and their deployment to the compute nodes in your pool.

  1. Azure Portal で、 [その他のサービス] > [Batch アカウント] の順にクリックし、Batch アカウントの名前をクリックします。In the Azure portal, click More services > Batch accounts, and click the name of your Batch account.
  2. [アプリケーション] > [追加] の順にクリックします。Click Applications > Add.
  3. [アプリケーション ID] に「ffmpeg」と入力し、パッケージのバージョン「3.4」と入力します。For Application id enter ffmpeg, and a package version of 3.4. 前にダウンロードした ffmpeg の ZIP ファイルを選択し、 [OK] をクリックします。Select the ffmpeg zip file you downloaded previously, and then click OK. ffmpeg アプリケーション パッケージが Batch アカウントに追加されます。The ffmpeg application package is added to your Batch account.

アプリケーション パッケージの追加

アカウントの資格情報を取得するGet account credentials

この例では、Batch アカウントと Storage アカウントの資格情報を指定する必要があります。For this example, you need to provide credentials for your Batch and Storage accounts. Azure Portal を使用すると、必要な資格情報を簡単に取得できますA straightforward way to get the necessary credentials is in the Azure portal. (Azure API やコマンドライン ツールを使用してこれらの資格情報を取得することもできます)。(You can also get these credentials using the Azure APIs or command-line tools.)

  1. [すべてのサービス] > [Batch アカウント] の順に選択し、Batch アカウントの名前を選択します。Select All services > Batch accounts, and then select the name of your Batch account.

  2. Batch 資格情報を表示するには、 [キー] を選択します。To see the Batch credentials, select Keys. [Batch アカウント][URL][プライマリ アクセス キー] の値をテキスト エディターにコピーします。Copy the values of Batch account, URL, and Primary access key to a text editor.

  3. Storage アカウント名とキーを表示するには、 [ストレージ アカウント] を選択します。To see the Storage account name and keys, select Storage account. [ストレージ アカウント名][Key1] の値をテキスト エディターにコピーします。Copy the values of Storage account name and Key1 to a text editor.

サンプルのダウンロードと実行Download and run the sample

サンプルのダウンロードDownload the sample

GitHub からサンプル アプリをダウンロードまたは複製します。Download or clone the sample app from GitHub. Git クライアントを使用してサンプル アプリ リポジトリを複製するには、次のコマンドを使用します。To clone the sample app repo with a Git client, use the following command:

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

Visual Studio ソリューション ファイル BatchDotNetFfmpegTutorial.sln が含まれているディレクトリに移動します。Navigate to the directory that contains the Visual Studio solution file BatchDotNetFfmpegTutorial.sln.

Visual Studio でソリューション ファイルを開き、Program.cs 内の資格情報文字列を、お使いのアカウントに関して取得した値で更新します。Open the solution file in Visual Studio, and update the credential strings in Program.cs with the values you obtained for your accounts. 次に例を示します。For example:

// Batch account credentials
private const string BatchAccountName = "mybatchaccount";
private const string BatchAccountKey  = "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==";
private const string BatchAccountUrl  = "https://mybatchaccount.mybatchregion.batch.azure.com";

// Storage account credentials
private const string StorageAccountName = "mystorageaccount";
private const string StorageAccountKey  = "xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ==";

注意

この例では、単純化するために Batch アカウントと Storage アカウントの資格情報をクリア テキストで表示しています。To simplify the example, the Batch and Storage account credentials appear in clear text. 実際の資格情報は利用を制限し、コード中では環境変数か構成ファイルを使用して参照することをお勧めします。In practice, we recommend that you restrict access to the credentials and refer to them in your code using environment variables or a configuration file. その例については、Azure Batch のコード サンプル リポジトリを参照してください。For examples, see the Azure Batch code samples repo.

また、ソリューション内の ffmpeg アプリケーション パッケージの参照が Batch アカウントにアップロードした ffmpeg パッケージの ID およびバージョンと一致することを確認します。Also, make sure that the ffmpeg application package reference in the solution matches the Id and version of the ffmpeg package that you uploaded to your Batch account.

const string appPackageId = "ffmpeg";
const string appPackageVersion = "3.4";

サンプル プロジェクトのビルドと実行Build and run the sample project

Visual Studio またはコマンド ライン (dotnet build コマンドと dotnet run コマンド) でアプリケーションをビルドして実行します。Build and run the application in Visual Studio, or at the command line with the dotnet build and dotnet run commands. アプリケーションの実行後に、コードを確認して、アプリケーションの各部分での処理内容を学習します。After running the application, review the code to learn what each part of the application does. たとえば Visual Studio で次の操作を実行します。For example, in Visual Studio:

  • ソリューション エクスプローラーでソリューションを右クリックし、 [ソリューションのビルド] をクリックします。Right-click the solution in Solution Explorer and click Build Solution.

  • メッセージに従って NuGet パッケージの復元を確認します。Confirm the restoration of any NuGet packages, if you're prompted. 不足しているパッケージをダウンロードする必要がある場合は、NuGet Package Manager がインストールされていることを確認します。If you need to download missing packages, ensure the NuGet Package Manager is installed.

次に、それを実行します。Then run it. サンプル アプリケーションを実行すると、コンソールの出力は次のようになります。When you run the sample application, the console output is similar to the following. 実行中、プールのコンピューティング ノードを開始する際に、Monitoring all tasks for 'Completed' state, timeout in 00:30:00... で一時停止が発生します。During execution, you experience a pause at Monitoring all tasks for 'Completed' state, timeout in 00:30:00... while the pool's compute nodes are started.

Sample start: 11/19/2018 3:20:21 PM

Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [WinFFmpegPool]...
Creating job [WinFFmpegJob]...
Adding 5 tasks to job [WinFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks completed successfully within the specified timeout period.
Deleting container [input]...

Sample end: 11/19/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742

プール、コンピューティング ノード、ジョブ、タスクを監視するには、Azure Portal で Batch アカウントに移動します。Go to your Batch account in the Azure portal to monitor the pool, compute nodes, job, and tasks. たとえば、プール内のコンピューティング ノードのヒート マップを確認するには、 [プール] > WinFFmpegPool の順にクリックします。For example, to see a heat map of the compute nodes in your pool, click Pools > WinFFmpegPool.

タスクが実行されていると、ヒート マップは次のようになります。When tasks are running, the heat map is similar to the following:

プールのヒート マップ

既定の構成でアプリケーションを実行する場合、通常の実行時間は約 10 分間です。Typical execution time is approximately 10 minutes when you run the application in its default configuration. プールの作成に最も時間がかかります。Pool creation takes the most time.

出力ファイルを取得するRetrieve output files

Azure Portal を使用して、ffmpeg タスクによって生成された出力 MP3 ファイルをダウンロードすることができます。You can use the Azure portal to download the output MP3 files generated by the ffmpeg tasks.

  1. [すべてのサービス] > [ストレージ アカウント] の順にクリックし、ストレージ アカウントの名前をクリックします。Click All services > Storage accounts, and then click the name of your storage account.
  2. [BLOB] > [出力] の順にクリックします。Click Blobs > output.
  3. 出力 MP3 ファイルの 1 つを右クリックして、 [ダウンロード] をクリックします。Right-click one of the output MP3 files and then click Download. ブラウザーのメッセージに従って、ファイルを開くか保存します。Follow the prompts in your browser to open or save the file.

出力ファイルをダウンロードする

このサンプルには示されていませんが、コンピューティング ノードまたはストレージ コンテナーからプログラムでファイルをダウンロードすることもできます。Although not shown in this sample, you can also download the files programmatically from the compute nodes or from the storage container.

コードの確認Review the code

以降のセクションでは、サンプル アプリケーションを、Batch サービスでワークロードを処理するために実行する複数の手順に分けます。The following sections break down the sample application into the steps that it performs to process a workload in the Batch service. サンプルのすべてのコード行について説明しているわけではないので、この記事の残りの部分を読む際は、ソリューション内のファイル Program.cs を参照してください。Refer to the file Program.cs in the solution while you read the rest of this article, since not every line of code in the sample is discussed.

BLOB クライアントと Batch クライアントの認証Authenticate Blob and Batch clients

リンクされているストレージ アカウントを操作するために、アプリでは .NET 用 Azure Storage クライアント ライブラリを使用します。To interact with the linked storage account, the app uses the Azure Storage Client Library for .NET. CloudStorageAccount を使用してアカウントへの参照を作成し、共有キー認証を使用して認証します。It creates a reference to the account with CloudStorageAccount, authenticating using shared key authentication. その後、CloudBlobClient を作成します。Then, it creates a CloudBlobClient.

// Construct the Storage account connection string
string storageConnectionString = String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
                                StorageAccountName, StorageAccountKey);

// Retrieve the storage account
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

このアプリは BatchClient オブジェクトを作成して、Batch サービスでプール、ジョブ、タスクを作成および管理します。The app creates a BatchClient object to create and manage pools, jobs, and tasks in the Batch service. このサンプルの Batch クライアントでは共有キー認証を使用します。The Batch client in the sample uses shared key authentication. Batch は、個々のユーザーまたは自動アプリケーションを認証するために、Azure Active Directory による認証もサポートしています。Batch also supports authentication through Azure Active Directory to authenticate individual users or an unattended application.

BatchSharedKeyCredentials sharedKeyCredentials = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);

using (BatchClient batchClient = BatchClient.Open(sharedKeyCredentials))
...

入力ファイルのアップロードUpload input files

アプリは、blobClient オブジェクトを CreateContainerIfNotExistAsync メソッドに渡して、入力ファイル (MP4 形式) 用のストレージ コンテナーとタスク出力用のコンテナーを作成します。The app passes the blobClient object to the CreateContainerIfNotExistAsync method to create a storage container for the input files (MP4 format) and a container for the task output.

CreateContainerIfNotExistAsync(blobClient, inputContainerName);
CreateContainerIfNotExistAsync(blobClient, outputContainerName);

その後、ファイルは、ローカルの InputFiles フォルダーから入力用コンテナーにアップロードされます。Then, files are uploaded to the input container from the local InputFiles folder. ストレージ内のファイルは、Batch の ResourceFile オブジェクトとして定義されており、Batch が後でコンピューティング ノードにダウンロードできます。The files in storage are defined as Batch ResourceFile objects that Batch can later download to compute nodes.

Program.cs 内の 2 つのメソッドは、ファイルのアップロードに関連しています。Two methods in Program.cs are involved in uploading the files:

  • UploadFilesToContainerAsync:ResourceFile オブジェクトのコレクションを返し、内部的に UploadResourceFileToContainerAsync を呼び出して、inputFilePaths パラメーターで渡される各ファイルをアップロードします。UploadFilesToContainerAsync: Returns a collection of ResourceFile objects and internally calls UploadResourceFileToContainerAsync to upload each file that is passed in the inputFilePaths parameter.
  • UploadResourceFileToContainerAsync:各ファイルを BLOB として入力用コンテナーにアップロードします。UploadResourceFileToContainerAsync: Uploads each file as a blob to the input container. ファイルのアップロード後、BLOB の Shared Access Signature (SAS) を取得し、それを表す ResourceFile オブジェクトを返します。After uploading the file, it obtains a shared access signature (SAS) for the blob and returns a ResourceFile object to represent it.
string inputPath = Path.Combine(Environment.CurrentDirectory, "InputFiles");

List<string> inputFilePaths = new List<string>(Directory.GetFileSystemEntries(inputPath, "*.mp4",
    SearchOption.TopDirectoryOnly));

List<ResourceFile> inputFiles = await UploadFilesToContainerAsync(
  blobClient,
  inputContainerName,
  inputFilePaths);

.NET を使用してファイルを BLOB としてストレージ アカウントにアップロードする方法の詳細については、「.NET を使用して BLOB をアップロード、ダウンロード、および一覧表示する」を参照してください。For details about uploading files as blobs to a storage account with .NET, see Upload, download, and list blobs using .NET.

コンピューティング ノードのプールの作成Create a pool of compute nodes

次に、CreatePoolIfNotExistAsync が呼び出されて、コンピューティング ノードのプールが Batch アカウントに作成されます。Next, the sample creates a pool of compute nodes in the Batch account with a call to CreatePoolIfNotExistAsync. この定義済みのメソッドは、BatchClient.PoolOperations.CreatePool メソッドを使用してノードの数、VM のサイズ、プールの構成を設定します。This defined method uses the BatchClient.PoolOperations.CreatePool method to set the number of nodes, VM size, and a pool configuration. ここで、VirtualMachineConfiguration オブジェクトでは、ImageReference に、Azure Marketplace で公開されている Windows Server イメージを指定します。Here, a VirtualMachineConfiguration object specifies an ImageReference to a Windows Server image published in the Azure Marketplace. Batch は、Azure Marketplace のさまざまな VM イメージだけでなく、カスタム VM イメージもサポートしています。Batch supports a wide range of VM images in the Azure Marketplace, as well as custom VM images.

ノードの数と VM のサイズは、定義済みの定数を使用して設定されます。The number of nodes and VM size are set using defined constants. Batch では専用ノードと低優先度ノードがサポートされているため、ご利用のプールではそのいずれかまたは両方を使用できます。Batch supports dedicated nodes and low-priority nodes, and you can use either or both in your pools. 専用ノードは、プール用に予約されています。Dedicated nodes are reserved for your pool. 低優先度ノードは、Azure の VM の余剰容量から割引価格で提供されます。Low-priority nodes are offered at a reduced price from surplus VM capacity in Azure. 低優先度ノードは、Azure に十分な容量がない場合に使用できなくなります。Low-priority nodes become unavailable if Azure does not have enough capacity. このサンプルは、既定で、サイズ Standard_A1_v2 の低優先度ノードが 5 つだけ含まれているプールを作成します。The sample by default creates a pool containing only 5 low-priority nodes in size Standard_A1_v2.

注意

ノードのクォータを必ず確認してください。Be sure you check your node quotas. クォータ要求の作成手順については、「Batch サービスのクォータと制限」を参照してください。See Batch service quotas and limits for instructions on how to create a quota request."

ffmpeg アプリケーションは、プールの構成に ApplicationPackageReference を追加することで、コンピューティング ノードにデプロイされます。The ffmpeg application is deployed to the compute nodes by adding an ApplicationPackageReference to the pool configuration.

CommitAsync メソッドは、プールを Batch サービスに送信します。The CommitAsync method submits the pool to the Batch service.

ImageReference imageReference = new ImageReference(
    publisher: "MicrosoftWindowsServer",
    offer: "WindowsServer",
    sku: "2016-Datacenter-smalldisk",
    version: "latest");

VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.windows amd64");

pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: DedicatedNodeCount,
    targetLowPriorityComputeNodes: LowPriorityNodeCount,
    virtualMachineSize: PoolVMSize,
    virtualMachineConfiguration: virtualMachineConfiguration);

pool.ApplicationPackageReferences = new List<ApplicationPackageReference>
    {
    new ApplicationPackageReference {
    ApplicationId = appPackageId,
    Version = appPackageVersion}};

await pool.CommitAsync();  

ジョブの作成Create a job

Batch ジョブでは、タスクの実行対象となるプールと、作業の優先順位やスケジュールなどのオプションの設定を指定します。A Batch job specifies a pool to run tasks on and optional settings such as a priority and schedule for the work. このサンプルでは、CreateJobAsync の呼び出しを使用してジョブを作成します。The sample creates a job with a call to CreateJobAsync. この定義済みのメソッドは、BatchClient.JobOperations.CreateJob メソッドを使用してプールにジョブを作成します。This defined method uses the BatchClient.JobOperations.CreateJob method to create a job on your pool.

CommitAsync メソッドは、ジョブを Batch サービスに送信します。The CommitAsync method submits the job to the Batch service. 最初、ジョブにはタスクがありません。Initially the job has no tasks.

CloudJob job = batchClient.JobOperations.CreateJob();
job.Id = JobId;
job.PoolInformation = new PoolInformation { PoolId = PoolId };

await job.CommitAsync();

タスクの作成Create tasks

このサンプルでは、AddTasksAsync メソッドの呼び出しを使用してジョブにタスクを作成します。これにより、CloudTask オブジェクトの一覧が作成されます。The sample creates tasks in the job with a call to the AddTasksAsync method, which creates a list of CloudTask objects. CloudTask は、CommandLine プロパティを使用することで、ffmpeg を実行して入力の ResourceFile オブジェクトを処理します。Each CloudTask runs ffmpeg to process an input ResourceFile object using a CommandLine property. ffmpeg は、以前にプールが作成されたときに各ノードにインストールされています。ffmpeg was previously installed on each node when the pool was created. ここでは、コマンド ラインで ffmpeg を実行して、各入力 MP4 (ビデオ) ファイルを MP3 (オーディオ) ファイルに変換します。Here, the command line runs ffmpeg to convert each input MP4 (video) file to an MP3 (audio) file.

このサンプルでは、コマンド ラインの実行後に MP3 ファイルの OutputFile オブジェクトを作成します。The sample creates an OutputFile object for the MP3 file after running the command line. 各タスクの出力ファイル (この場合は 1 つ) は、タスクの OutputFiles プロパティを使用して、リンクされているストレージ アカウントのコンテナーにアップロードされます。Each task's output files (one, in this case) are uploaded to a container in the linked storage account, using the task's OutputFiles property. 以前、コード サンプルでは、出力コンテナーへの書き込みアクセス権を得るために Shared Access Signature URL (outputContainerSasUrl) が取得されました。Previously in the code sample, a shared access signature URL (outputContainerSasUrl) was obtained to provide write access to the output container. outputFile オブジェクトに設定されている条件に注意してください。Note the conditions set on the outputFile object. タスクが正常に完了すると、タスクからの出力ファイルがコンテナーに単純にアップロードされます (OutputFileUploadCondition.TaskSuccess)。An output file from a task is only uploaded to the container after the task has successfully completed (OutputFileUploadCondition.TaskSuccess). 実装の詳細については、GitHub のコード サンプルを参照してください。See the full code sample on GitHub for further implementation details.

その後、このサンプルは、AddTaskAsync メソッドを使用してジョブにタスクを追加します。これにより、タスクは、コンピューティング ノードで実行するためにキューに登録されます。Then, the sample adds tasks to the job with the AddTaskAsync method, which queues them to run on the compute nodes.

 // Create a collection to hold the tasks added to the job.
List<CloudTask> tasks = new List<CloudTask>();

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);

    // Define task command line to convert each input file.
    string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion);
    string inputMediaFile = inputFiles[i].FilePath;
    string outputMediaFile = String.Format("{0}{1}",
        System.IO.Path.GetFileNameWithoutExtension(inputMediaFile),
        ".mp3");
    string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-3.4-win64-static\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile);

    // Create a cloud task (with the task ID and command line)
    CloudTask task = new CloudTask(taskId, taskCommandLine);
    task.ResourceFiles = new List<ResourceFile> { inputFiles[i] };

    // Task output file
    List<OutputFile> outputFileList = new List<OutputFile>();
    OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination(outputContainerSasUrl);
    OutputFile outputFile = new OutputFile(outputMediaFile,
       new OutputFileDestination(outputContainer),
       new OutputFileUploadOptions(OutputFileUploadCondition.TaskSuccess));
    outputFileList.Add(outputFile);
    task.OutputFiles = outputFileList;
    tasks.Add(task);
}

// Add tasks as a collection
await batchClient.JobOperations.AddTaskAsync(jobId, tasks);
return tasks

タスクの監視Monitor tasks

Batch によってタスクがジョブに追加されると、関連付けられたプール内のコンピューティング ノードで実行するために自動的にキューに登録され、スケジュールが設定されます。When Batch adds tasks to a job, the service automatically queues and schedules them for execution on compute nodes in the associated pool. 指定した設定に基づいて、Batch は、タスクのキューへの登録、スケジュール設定、再試行など、タスク管理作業すべてを処理します。Based on the settings you specify, Batch handles all task queuing, scheduling, retrying, and other task administration duties.

タスクの実行を監視する方法は多数ありますが、There are many approaches to monitoring task execution. このサンプルでは、完了と、タスクの失敗または成功の状態のみをレポートするよう MonitorTasks メソッドを定義します。This sample defines a MonitorTasks method to report only on completion and task failure or success states. MonitorTasks コードでは、ODATADetailLevel を指定して、タスクについて最小限の情報のみを効率的に選択します。The MonitorTasks code specifies an ODATADetailLevel to efficiently select only minimal information about the tasks. その後、TaskStateMonitor を作成します。これは、タスクの状態を監視するためのヘルパー ユーティリティを提供します。Then, it creates a TaskStateMonitor, which provides helper utilities for monitoring task states. MonitorTasks で、サンプルはすべてのタスクが制限時間内に TaskState.Completed に達するまで待ちます。In MonitorTasks, the sample waits for all tasks to reach TaskState.Completed within a time limit. その後、ジョブを終了し、完了してもゼロ以外の終了コードなどのエラーが発生している可能性があるタスクに関するレポートを作成します。Then it terminates the job and reports on any tasks that completed but may have encountered a failure such as a non-zero exit code.

TaskStateMonitor taskStateMonitor = batchClient.Utilities.CreateTaskStateMonitor();
try
{
    await taskStateMonitor.WhenAll(addedTasks, TaskState.Completed, timeout);
}
catch (TimeoutException)
{
    batchClient.JobOperations.TerminateJob(jobId);
    Console.WriteLine(incompleteMessage);
    return false;
}
batchClient.JobOperations.TerminateJob(jobId);
 Console.WriteLine(completeMessage);
...

リソースをクリーンアップするClean up resources

タスクの実行後、自動的に、作成された入力用ストレージ コンテナーが削除され、Batch プールとジョブを削除するためのオプションが表示されます。After it runs the tasks, the app automatically deletes the input storage container it created, and gives you the option to delete the Batch pool and job. BatchClient の JobOperations クラスと PoolOperations クラスの両方に対応する削除メソッドがあります。このメソッドは、削除を確定すると呼び出されます。The BatchClient's JobOperations and PoolOperations classes both have corresponding delete methods, which are called if you confirm deletion. ジョブとタスク自体は課金対象ではありませんが、コンピューティング ノードは課金対象です。Although you're not charged for jobs and tasks themselves, you are charged for compute nodes. そのため、必要な場合にのみプールを割り当てることをお勧めします。Thus, we recommend that you allocate pools only as needed. プールを削除すると、ノード上のタスク出力はすべて削除されます。When you delete the pool, all task output on the nodes is deleted. ただし、出力ファイルはストレージ アカウントに残ります。However, the output files remain in the storage account.

リソース グループ、Batch アカウント、ストレージ アカウントは、不要になったら削除します。When no longer needed, delete the resource group, Batch account, and storage account. Azure Portal でこれを行うには、Batch アカウントのリソース グループを選択し、 [リソース グループの削除] をクリックしてください。To do so in the Azure portal, select the resource group for the Batch account and click Delete resource group.

次のステップNext steps

このチュートリアルで学習した内容は次のとおりです。In this tutorial, you learned about how to:

  • アプリケーション パッケージを Batch アカウントに追加するAdd an application package to your Batch account
  • Batch アカウントおよびストレージ アカウントで認証するAuthenticate with Batch and Storage accounts
  • Storage に入力ファイルをアップロードするUpload input files to Storage
  • アプリケーションを実行するコンピューティング ノードのプールを作成するCreate a pool of compute nodes to run an application
  • 入力ファイルを処理するジョブとタスクを作成するCreate a job and tasks to process input files
  • タスクの実行を監視するMonitor task execution
  • 出力ファイルを取得するRetrieve output files

.NET API を使用して Batch ワークロードのスケジュール設定と処理を行う他の例については、GitHub のサンプルを参照してください。For more examples of using the .NET API to schedule and process Batch workloads, see the samples on GitHub.

インスタンス変数 LowPriorityNodeCount=0 と DedicatedNodeCount=5 を設定することによって問題が解決され、ジョブが実行できるようになりました。Setting the instance variable LowPriorityNodeCount=0 and the DedicatedNodeCount=5 fixed the issue and allowed the job to complete.