Azure Batchで実行されているタスクは、実行時に出力データを生成する場合があります。 多くの場合、タスク出力データは、ジョブ内の他のタスク、ジョブを実行したクライアント アプリケーション、またはその両方で取得するために格納する必要があります。 タスクは Batch コンピューティング ノードのファイル システムに出力データを書き込みますが、ノードが再イメージ化されたとき、またはノードがプールを離れると、ノード上のすべてのデータが失われます。 また、タスクにはファイルの保持期間があり、その後、タスクによって作成されたファイルが削除されます。 このような理由から、後で必要になるタスク出力を、
Batch のストレージ アカウント オプションについては、「Batch アカウントとAzure Storage アカウントを参照してください。
.NET の
ファイル規則ライブラリを使用して出力ファイルを取得するには、ジョブまたはタスクのファイルを見つけます。 ファイルの名前や場所を知る必要はありません。 代わりに、ID と目的でファイルを一覧表示できます。 たとえば、特定のタスクのすべての中間ファイルを一覧表示します。 または、特定のジョブのプレビュー ファイルを取得します。
バージョン 2017-05-01 以降、Batch サービス API では、仮想マシン (VM) 構成で作成されたプールで実行されるタスクとジョブ マネージャー タスクの出力データをAzure Storageに保持できます。 タスクを作成するコード内から出力を保持できます。 このメソッドは、ファイル規則ライブラリの代わりに使用できます。 Batch クライアント アプリケーションを変更して出力を保持できます。タスクが実行されているアプリケーションを更新する必要はありません。 詳細については、「Persist タスク データを Batch サービス API でAzure Storageするを参照してください。
ライブラリのユース ケース
Azure Batchには、タスク出力を保持する複数の方法が用意されています。 次の場合は、ファイル規則ライブラリを使用します。
- タスクが実行されているアプリケーションのコードを変更して、ファイルを保持します。
- タスクの実行中にデータをAzure Storageにストリーミングします。
- プールからのデータを保持します。
- クライアント アプリケーションまたはその他のタスクで、ID または目的別にタスク出力ファイルを見つけてダウンロードします。
- Azure ポータルでのタスク出力。
その他のシナリオでは、別のアプローチを検討する必要があります。 その他のオプションの詳細については、「ジョブとタスクの出力をAzure Storageに保存する方法」を参照してください。
Batch ファイル規則の標準とは
Batch ファイル規則標準では、出力ファイルの書き込み先となるコンテナーと BLOB パスの名前付けスキームが提供されます。 標準に従Azureストレージに永続化されたファイルは、Azure ポータルで自動的に表示できます。
.NETのファイル規則ライブラリでは、標準に従ってストレージ コンテナーとタスク出力ファイルに自動的に名前が付けられます。 ライブラリには、Azure Storageの出力ファイルに対してクエリを実行するメソッドも用意されています。 ジョブ ID、タスク ID、または目的でクエリを実行できます。
.NET以外の言語で開発している場合は、アプリケーションでファイル規則標準を自分で実装できます。 詳細については、「 Batch ファイル規則標準の実装」を参照してください。
Azure Storage アカウントをリンクする
ファイル規則ライブラリを使用して出力データをAzure Storageに保持するには、まず、Azure Storage アカウントを Batch アカウントにリンクします。
- Azure ポータルにサインインします。
- 検索バーで Batch を検索して選択します。
- Azure Storageにリンクする Batch アカウントを選択します。
- [Batch アカウント] ページの [設定] で、[ ストレージ アカウント] を選択します。
- Batch アカウントに関連付けられているAzure Storage アカウントがまだない場合は、Storage Account (None) を選択します。
- 使用するAzure Storage アカウントを選択します。 最適なパフォーマンスを得る場合は、Batch アカウントと同じリージョンのアカウントを使用します。
出力データを保持する
ファイル規則ライブラリを使用して、ジョブとタスクの出力データを保持できます。 まず、Azure Storageにコンテナーを作成します。 次に、出力をコンテナーに保存します。 タスク コードで .NET
Azure Storageでのコンテナーと BLOB の操作の詳細については、「Get started with Azure Blob Storage using .NET」を参照してください。
ファイル規則ライブラリで保持されているすべてのジョブとタスクの出力は、同じコンテナーに格納されます。 多数のタスクが同時にファイルを保持しようとすると、Azure Storageの調整制限が適用される可能性があります。 詳細については、 Blob Storage のパフォーマンスとスケーラビリティのチェックリストを参照してください。
ストレージ コンテナーを作成する
タスク出力をAzure Storageに保持するには、最初に CloudJob.PrepareOutputStorageAsync を呼び出してコンテナーを作成します。 この拡張メソッドは、 CloudStorageAccount オブジェクトをパラメーターとして受け取ります。 このメソッドは、ファイル規則標準に従って名前付きのコンテナーを作成します。 コンテナーの内容は、Azure ポータルと、この記事で説明する取得方法で検出できます。
通常は、プール、ジョブ、タスクを作成するコンテナーをクライアント アプリケーションに作成します。 例えば次が挙げられます。
CloudJob job = batchClient.JobOperations.CreateJob(
"myJob",
new PoolInformation { PoolId = "myPool" });
// Create reference to the linked Azure Storage account
CloudStorageAccount linkedStorageAccount =
new CloudStorageAccount(myCredentials, true);
// Create the blob storage container for the outputs
await job.PrepareOutputStorageAsync(linkedStorageAccount);
タスクの出力を格納する
ストレージ コンテナーを作成した後、タスクは TaskOutputStorage を使用してコンテナーに出力を保存できます。 このクラスは、ファイル規則ライブラリで使用できます。
タスク コードで、 TaskOutputStorage オブジェクトを作成します。 タスクの作業が完了したら、 TaskOutputStorage を呼び出します。SaveAsync メソッド。 この手順では、出力をAzure Storageに保存します。
CloudStorageAccount linkedStorageAccount = new CloudStorageAccount(myCredentials);
string jobId = Environment.GetEnvironmentVariable("AZ_BATCH_JOB_ID");
string taskId = Environment.GetEnvironmentVariable("AZ_BATCH_TASK_ID");
TaskOutputStorage taskOutputStorage = new TaskOutputStorage(
linkedStorageAccount, jobId, taskId);
/* Code to process data and produce output file(s) */
await taskOutputStorage.SaveAsync(TaskOutputKind.TaskOutput, "frame_full_res.jpg");
await taskOutputStorage.SaveAsync(TaskOutputKind.TaskPreview, "frame_low_res.jpg");
の パラメーター。SaveAsync メソッドは、永続化されたファイルを分類します。 定義済みの TaskOutputKind 型には、 、 、 、 の 4 種類があります。また、出力のカスタム カテゴリを定義することもできます。
後で Batch にクエリを実行するときに一覧表示する出力の種類を指定します。 次に、タスクの出力を一覧表示するときに、出力の種類のいずれかをフィルター処理できます。 たとえば、"Give me the preview output for task 109" (タスク 109 のプレビュー出力を表示する) というフィルターを適用します。詳細については、出力データの取得を参照してください。
出力の種類によって、Azure ポータルに
ジョブの出力の格納
ジョブ全体に関連付けられている出力を格納することもできます。 たとえば、ムービー レンダリング ジョブのマージ タスクでは、完全にレンダリングされたムービーをジョブ出力として保持できます。 ジョブが完了すると、クライアント アプリケーションはジョブの出力を一覧表示および取得できます。 クライアント アプリケーションは、個々のタスクに対してクエリを実行する必要はありません。
JobOutputStorage を呼び出してジョブ出力を格納します。SaveAsync メソッド。 JobOutputKind とファイル名を指定します。 例えば次が挙げられます。
CloudJob job = new JobOutputStorage(acct, jobId);
JobOutputStorage jobOutputStorage = job.OutputStorage(linkedStorageAccount);
await jobOutputStorage.SaveAsync(JobOutputKind.JobOutput, "mymovie.mp4");
await jobOutputStorage.SaveAsync(JobOutputKind.JobPreview, "mymovie_preview.mp4");
タスク出力の TaskOutputKind 型と同様に、 JobOutputKind 型を使用してジョブの永続化されたファイルを分類します。 後で、特定の種類の出力を一覧表示できます。 JobOutputKind 型には、出力カテゴリとプレビュー カテゴリの両方が含まれます。 この型では、カスタム カテゴリの作成もサポートされています。
タスク ログを格納する
また、タスクの実行中に更新されたファイルを保持する必要がある場合もあります。 たとえば、ログ ファイルを保持したり、 と したりする必要がある場合があります。 ファイル規則ライブラリは TaskOutputStorage を提供します。SaveTrackedAsync メソッドを使用して、これらの種類のファイルを保持します。 SaveTrackedAsync を使用して、指定した間隔でノード上のファイルの更新を追跡します。 次に、これらの更新をAzure Storageに保持します。
次の例では、SaveTrackedAsync を使用して、タスクの実行中に 15 秒ごとに stdout.txt をAzure Storageで更新します。
TimeSpan stdoutFlushDelay = TimeSpan.FromSeconds(3);
string logFilePath = Path.Combine(
Environment.GetEnvironmentVariable("AZ_BATCH_TASK_DIR"), "stdout.txt");
// The primary task logic is wrapped in a using statement that sends updates to
// the stdout.txt blob in Storage every 15 seconds while the task code runs.
using (ITrackedSaveOperation stdout =
await taskStorage.SaveTrackedAsync(
TaskOutputKind.TaskLog,
logFilePath,
"stdout.txt",
TimeSpan.FromSeconds(15)))
{
/* Code to process data and produce output file(s) */
// We are tracking the disk file to save our standard output, but the
// node agent may take up to 3 seconds to flush the stdout stream to
// disk. So give the file a moment to catch up.
await Task.Delay(stdoutFlushDelay);
}
コメントされたセクション を、タスクが通常行うコードに置き換えます。 たとえば、Azure Storageからデータをダウンロードし、変換や計算を実行するコードがあるとします。 このコードを ブロックにラップして、 SaveTrackedAsync を使用してファイルを定期的に更新できます。
ノード エージェントは、プール内の各ノードで実行されるプログラムです。 このプログラムは、ノードと Batch サービスの間のコマンドおよび制御インターフェイスを提供します。 この ブロックの末尾には、呼び出しが必要です。 この呼び出しにより、ノード エージェントが標準の内容をノード上の ファイルにフラッシュする時間があることを確認します。 この遅延がなければ、最後の数秒の出力を見逃す可能性があります。 すべてのファイルにこの遅延は必要ない場合があります。
SaveTrackedAsync を使用してファイルの追跡を有効にすると、追跡対象のファイルにappendsのみがAzure Storageに保持されます。 このメソッドは、ローテーションされていないログ ファイル、またはファイルの末尾に追加操作で書き込まれた他のファイルを追跡する場合にのみ使用します。
出力データを取得する
特定のタスクまたはジョブの出力ファイルを取得するには、Azure Storageまたはファイル名のパスを知る必要はありません。 代わりに、タスクまたはジョブ ID で出力ファイルを要求できます。
次のコード例では、ジョブのタスクを反復処理します。 次に、タスクの出力ファイルに関する情報を出力します。 その後、コードによって AzureStorage からファイルがダウンロードされます。
foreach (CloudTask task in myJob.ListTasks())
{
foreach (OutputFileReference output in
task.OutputStorage(storageAccount).ListOutputs(
TaskOutputKind.TaskOutput))
{
Console.WriteLine($"output file: {output.FilePath}");
output.DownloadToFileAsync(
$"{jobId}-{output.FilePath}",
System.IO.FileMode.Create).Wait();
}
}
Azure ポータルで出力ファイルを表示する
タスク出力ファイルで Batch ファイル規則標準 を使用している場合は、Azure ポータルでファイルを表示できます。
ポータルで出力ファイルの表示を有効にするには、次の要件を満たす必要があります。
Azure ポータルに出力ファイルを自動的に表示するには、次の手順を実行する必要があります。
- Azure Storage アカウントを Batch アカウントにリンクします。
- Azure Storageコンテナーとファイルの定義済みの名前付け規則に従います。 File Conventions ライブラリを使用して出力を保持する場合、ファイルはファイル規則の標準に従って保持されます。
Azure ポータルでタスク出力ファイルとログを表示するには:
- Azure ポータルにサインインします。
- 出力を表示するタスクに移動します。
- [ 保存された出力ファイル] または [ 保存されたログ] を選択します。
コード サンプル
PersistOutputs サンプル プロジェクトは、GitHubの Azure Batch コード サンプルの 1 つです。 このVisual Studio ソリューションでは、Azure Batch ファイル規則ライブラリを使用して、タスク出力を永続的ストレージに保持する方法を示します。 サンプルを実行するには、次の手順に従います。
- Visual Studio 2019 でプロジェクトを開きます。
- AccountSettings.settings にあなたの Batch と Azure Storage アカウントの資格情報を追加し、Microsoft.Azure.Batch.Samples.Common プロジェクトに保存します。
- ソリューションをビルドします。 ソリューションをまだ実行しないでください。
- メッセージが表示されたら、NuGet パッケージを復元します。
- Azure ポータルから application パッケージを PersistOutputsTask にアップロードします。
- 実行可能ファイルとその依存アセンブリを .zip パッケージに含めます。
- アプリケーション ID を に設定します。
- アプリケーション パッケージのバージョンを に設定します。
- [開始] を選択してプロジェクトを実行します。
- 使用する永続化テクノロジの選択を求められたら、「1」と入力 します。 このオプションでは、ファイル規則ライブラリを使用してサンプルを実行し、タスクの出力を保持します。
.NETの Batch ファイル規則ライブラリを取得する
.NET用の Batch ファイル規則ライブラリは、NuGet で使用できます。 このライブラリは、 CloudJob クラスと CloudTask クラスを 新しいメソッドで拡張します。 詳細については、 ファイル規則ライブラリのリファレンス ドキュメントを参照してください。
File Conventions ライブラリのソース コードは、GitHubで使用できます。