Azure Batch で実行されているタスクでは、実行時に出力データが生成される場合があります。 多くの場合、タスク出力データは、ジョブ内の他のタスク、ジョブを実行したクライアント アプリケーション、またはその両方で取得するために格納する必要があります。 タスクは Batch コンピューティング ノードのファイル システムに出力データを書き込みますが、ノードが再イメージ化されたとき、またはノードがプールを離れると、ノード上のすべてのデータが失われます。 また、タスクにはファイルの保持期間があり、その後、タスクによって作成されたファイルが削除されます。 このような理由から、後で必要になるタスク出力を Azure Storage などのデータ ストアに保持することが重要です。
Batch のストレージ アカウント オプションについては、「 Batch アカウントと Azure Storage アカウント」を参照してください。
Batch サービス API は、 仮想マシン構成を使用してプールで実行されるタスクとジョブ マネージャー タスクの出力データを Azure Storage に保持することをサポートしています。 タスクを追加するときに、タスクの出力先として Azure Storage 内のコンテナーを指定できます。 その後、Batch サービスは、タスクが完了すると、そのコンテナーに出力データを書き込みます。
Batch サービス API を使用してタスクの出力を保持する場合、タスクが実行されているアプリケーションを変更する必要はありません。 代わりに、クライアント アプリケーションにいくつかの変更を加えて、タスクを作成するのと同じコード内からタスクの出力を保持できます。
Important
Batch サービス API を使用して Azure Storage にタスク データを保持することは 、2018 年 2 月 1 日より前に作成されたプールでは機能しません。
Batch サービス API を使用してタスクの出力を保持するタイミング
Azure Batch には、タスク出力を保持する複数の方法が用意されています。 Batch サービス API の使用は、次のシナリオに最も適した便利なアプローチです。
- タスクが実行されているアプリケーションを変更せずに、クライアント アプリケーション内からタスクの出力を保持するコードを記述する必要があります。
- Batch タスクとジョブ マネージャー タスクからの出力を、仮想マシン構成で作成されたプールに保持する必要があります。
- 任意の名前で Azure Storage コンテナーに出力を保持する必要があります。
- Batch ファイル規則標準に従って名前が付けられた Azure Storage コンテナーに出力を保持する必要があります。
シナリオが上記と異なる場合は、別のアプローチを検討する必要があります。 たとえば、Batch サービス API は現在、タスクの実行中に Azure Storage へのストリーミング出力をサポートしていません。 出力をストリーミングするには、.NET で使用できる Batch ファイル規則ライブラリの使用を検討してください。 他の言語の場合は、独自のソリューションを実装する必要があります。 その他のオプションの詳細については、「 ジョブとタスクの出力を Azure Storage に保持する」を参照してください。
Azure Storage でコンテナーを作成する
タスクの出力を Azure Storage に保持するには、出力ファイルの宛先として機能するコンテナーを作成する必要があります。 適切な Azure Storage クライアント ライブラリまたは SDK を使用して、ジョブを送信する前に、タスクを実行する前にコンテナーを作成します。 Azure Storage API の詳細については、 Azure Storage のドキュメントを参照してください。
たとえば、C# でアプリケーションを記述する場合は、 .NET 用の Azure Storage クライアント ライブラリを使用します。 次の例は、コンテナーを作成する方法を示しています。
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
await container.CreateIfNotExists();
タスク出力の出力ファイルを指定する
タスクの出力ファイルを指定するには、 OutputFile オブジェクトのコレクションを作成し、タスクの作成時に CloudTask.OutputFiles プロパティに割り当てます。 Shared Access Signature (SAS) またはマネージド ID を使用して、コンテナーへのアクセスを認証できます。
共有アクセス シグネチャの使用
コンテナーを作成したら、コンテナーへの書き込みアクセス権を持つ Shared Access Signature (SAS) を取得します。 SAS は、コンテナーへの委任されたアクセスを提供します。 SAS は、指定した一連のアクセス許可を持つアクセス権を、指定された時間間隔で付与します。 Batch サービスには、タスク出力をコンテナーに書き込む書き込みアクセス許可を持つ SAS が必要です。 SAS の詳細については、「 Azure Storage での Shared Access Signature (SAS) の使用」を参照してください。
Azure Storage API を使用して SAS を取得すると、API は SAS トークン文字列を返します。 このトークン文字列には、SAS のすべてのパラメーター (アクセス許可と SAS が有効な間隔を含む) が含まれます。 SAS を使用して Azure Storage 内のコンテナーにアクセスするには、SAS トークン文字列をリソース URI に追加する必要があります。 リソース URI は、追加された SAS トークンと共に、Azure Storage への認証済みアクセスを提供します。
次の例は、コンテナーの書き込み専用 SAS トークン文字列を取得し、その SAS をコンテナー URI に追加する方法を示しています。
string containerSasToken = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddDays(1),
Permissions = SharedAccessBlobPermissions.Write
});
string containerSasUrl = container.Uri.AbsoluteUri + containerSasToken;
次の C# コード例では、 output.txtという名前のファイルに乱数を書き込むタスクを作成します。 この例では、コンテナーに書き込む output.txt の出力ファイルを作成します。 この例では、ファイル パターンのstd*.txt (やstdout.txtstderr.txt) に一致するログ ファイルの出力ファイルも作成します。 コンテナー URL には、コンテナー用に以前に作成された SAS が必要です。 Batch サービスは、SAS を使用してコンテナーへのアクセスを認証します。
new CloudTask(taskId, "cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles = new List<OutputFile>
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination(
new OutputFileBlobContainerDestination(
containerUrl: containerSasUrl,
path: taskId)),
uploadOptions: new OutputFileUploadOptions(
uploadCondition: OutputFileUploadCondition.TaskCompletion)),
new OutputFile(
filePattern: @"output.txt",
destination:
new OutputFileDestination(new OutputFileBlobContainerDestination(
containerUrl: containerSasUrl,
path: taskId + @"\output.txt")),
uploadOptions: new OutputFileUploadOptions(
uploadCondition: OutputFileUploadCondition.TaskCompletion)),
}
注
Linux でこの例を使用する場合は、円記号をスラッシュに変更してください。
マネージド ID の使用
コンテナーへの書き込みアクセス権を持つ SAS を生成して Batch に渡す代わりに、マネージド ID を使用して Azure Storage での認証を行うことができます。 ID を Batch プールに割り当てる必要があります。また、書き込むコンテナーの Storage Blob Data Contributor ロールの割り当ても必要です。 その後、Batch サービスは、SAS ではなくマネージド ID を使用してコンテナーへのアクセスを認証するように伝えることができます。
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
await container.CreateIfNotExists();
new CloudTask(taskId, "cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles = new List<OutputFile>
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination(
new OutputFileBlobContainerDestination(
containerUrl: container.Uri,
path: taskId,
identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name"} })),
uploadOptions: new OutputFileUploadOptions(
uploadCondition: OutputFileUploadCondition.TaskCompletion))
}
}
一致するファイル パターンを指定する
出力ファイルを指定する場合は、 OutputFile.FilePattern プロパティを使用して、一致するファイル パターンを指定できます。 ファイル パターンは、0 個のファイル、1 つのファイル、またはタスクによって作成された一連のファイルと一致する場合があります。
FilePattern プロパティは、* (非再帰的一致の場合) や** (再帰的一致の場合) などの標準的なファイルシステムワイルドカードをサポートします。 たとえば、上記のコード サンプルでは、 std*.txt 非再帰的に一致するファイル パターンを指定しています。
filePattern: @"..\std*.txt"
1 つのファイルをアップロードするには、ワイルドカードを使用しないファイル パターンを指定します。 たとえば、上記のコード サンプルでは、 output.txtに一致するファイル パターンを指定しています。
filePattern: @"output.txt"
アップロード条件を指定する
OutputFileUploadOptions.UploadCondition プロパティは、出力ファイルの条件付きアップロードを許可します。 一般的なシナリオでは、タスクが成功した場合は 1 つのファイル セットをアップロードし、失敗した場合は別のファイル セットをアップロードします。 たとえば、タスクが失敗し、0 以外の終了コードで終了した場合にのみ、詳細ログ ファイルをアップロードできます。 同様に、タスクが成功した場合にのみ結果ファイルをアップロードできます。タスクが失敗した場合、それらのファイルが見つからないか不完全である可能性があるためです。
上記のコード サンプルでは、 UploadCondition プロパティを TaskCompletion に設定しています。 この設定では、終了コードの値に関係なく、タスクの完了後にファイルをアップロードするように指定します。
uploadCondition: OutputFileUploadCondition.TaskCompletion
その他の設定については、 OutputFileUploadCondition 列挙型を参照してください。
同じ名前のファイルのあいまいさを解消する
ジョブ内のタスクによって、同じ名前のファイルが生成される場合があります。 たとえば、 stdout.txt と stderr.txt は、ジョブで実行されるすべてのタスクに対して作成されます。 各タスクは独自のコンテキストで実行されるため、これらのファイルはノードのファイル システム上で競合しません。 ただし、複数のタスクから共有コンテナーにファイルをアップロードする場合は、同じ名前のファイルを明確にする必要があります。
OutputFileBlobContainerDestination。Path プロパティは、出力ファイルの宛先 BLOB または仮想ディレクトリを指定します。 Path プロパティを使用すると、同じ名前の出力ファイルに Azure Storage で一意の名前が付けられるように、BLOB または仮想ディレクトリに名前を付けることができます。 パスでタスク ID を使用すると、一意の名前を確保し、ファイルを簡単に識別できます。
FilePattern プロパティがワイルドカード式に設定されている場合、パターンに一致するすべてのファイルは、Path プロパティで指定された仮想ディレクトリにアップロードされます。 たとえば、コンテナーが mycontainerされ、タスク ID が mytaskされ、ファイル パターンが ..\std*.txtされている場合、Azure Storage の出力ファイルに対する絶対 URI は次のようになります。
https://myaccount.blob.core.windows.net/mycontainer/mytask/stderr.txt
https://myaccount.blob.core.windows.net/mycontainer/mytask/stdout.txt
FilePattern プロパティが 1 つのファイル名と一致するように設定されている場合(つまり、ワイルドカード文字が含まれていない場合)、Path プロパティの値は完全修飾 BLOB 名を指定します。 複数のタスクの 1 つのファイルとの名前付けの競合が予想される場合は、仮想ディレクトリの名前をファイル名の一部として含め、それらのファイルを明確にします。 たとえば、タスク ID、区切り文字 (通常はスラッシュ)、ファイル名を含むように Path プロパティを設定します。
path: taskId + @"/output.txt"
一連のタスクの出力ファイルに対する絶対 URI は次のようになります。
https://myaccount.blob.core.windows.net/mycontainer/task1/output.txt
https://myaccount.blob.core.windows.net/mycontainer/task2/output.txt
Azure Storage の仮想ディレクトリの詳細については、「 コンテナー内の BLOB の一覧表示」を参照してください。
多くの出力ファイル
タスクで多数の出力ファイルを指定すると、Azure Batch API によって課される制限が発生する可能性があります。 タスクを小さくし、出力ファイルの数を少なくしておくことをお勧めします。
制限が発生した場合は、 ファイル パターン を使用するか、tar や zip などのファイル コンテナーを使用して出力ファイルを統合することで、出力ファイルの数を減らすことを検討してください。 または、マウントやその他の方法を使用して出力データを保持します ( ジョブとタスクの出力の永続化を参照)。
ファイルのアップロード エラーを診断する
Azure Storage への出力ファイルのアップロードが失敗した場合、タスクは 完了 状態と TaskExecutionInformation に移動します。FailureInformation プロパティが設定されています。 FailureInformation プロパティを調べて、発生したエラーを確認します。 たとえば、コンテナーが見つからない場合にファイルのアップロード時に発生するエラーを次に示します。
Category: UserError
Code: FileUploadContainerNotFound
Message: One of the specified Azure container(s) was not found while attempting to upload an output file
ファイルのアップロードごとに、Batch はコンピューティング ノードに 2 つのログ ファイル ( fileuploadout.txt と fileuploaderr.txt) を書き込みます。 特定のエラーの詳細について、これらのログ ファイルを確認することができます。 たとえば、タスク自体を実行できなかったためにファイルのアップロードが試行されなかった場合、これらのログ ファイルは存在しません。
ファイルアップロードのパフォーマンスを診断する
fileuploadout.txt ファイルはアップロードの進行状況を記録します。 このファイルを調べて、ファイルのアップロードにかかる時間の詳細を確認できます。 アップロードのパフォーマンスには、ノードのサイズ、アップロード時のノード上の他のアクティビティ、ターゲット コンテナーが Batch プールと同じリージョンにあるかどうか、同時にストレージ アカウントにアップロードしているノードの数など、多くの要因があることに注意してください。
Batch ファイル規則標準で Batch サービス API を使用する
Batch サービス API を使用してタスク出力を保持する場合は、目的のコンテナーと BLOB に好きな名前を付けることができます。 バッチ ファイル規則標準に従って名前を付けることもできます。 ファイル規則標準では、ジョブとタスクの名前に基づいて、特定の出力ファイルの Azure Storage 内の宛先コンテナーと BLOB の名前が決定されます。 出力ファイルの名前付けにファイル規則標準を使用する場合は、 Azure portal で出力ファイルを表示できます。
C# で開発している場合は、 .NET 用 Batch ファイル規則ライブラリに組み込まれているメソッドを使用できます。 このライブラリでは、適切な名前のコンテナーと BLOB パスが自動的に作成されます。 たとえば、API を呼び出して、ジョブ名に基づいてコンテナーの正しい名前を取得できます。
string containerName = job.OutputStorageContainerName();
CloudJobExtensions.GetOutputStorageContainerUrl メソッドを使用して、コンテナーへの書き込みに使用される Shared Access Signature (SAS) URL を返すことができます。 その後、この SAS を OutputFileBlobContainerDestination コンストラクターに渡すことができます。
C# 以外の言語で開発している場合は、ファイル規則標準を自分で実装する必要があります。
コード サンプル
PersistOutputs サンプル プロジェクトは、GitHub の Azure Batch コード サンプルの 1 つです。 この Visual Studio ソリューションでは、.NET 用 Batch クライアント ライブラリを使用して、タスクの出力を永続ストレージに保持する方法を示します。 サンプルを実行するには、次の手順に従います。
- Visual Studio 2019 でプロジェクトを開きます。
- Batch アカウントとストレージ アカウントの資格情報 を、Microsoft.Azure.Batch.Samples.Common プロジェクトの AccountSettings.settings に追加します。
- ソリューションをビルドします (ただし、実行しないでください)。 メッセージが表示されたら、NuGet パッケージを復元します。
- Azure portal を使用して PersistOutputsTask 用のアプリケーション パッケージをアップロードします。
PersistOutputsTask.exeとその依存アセンブリを .zip パッケージに含め、アプリケーション ID を "PersistOutputsTask" に設定し、アプリケーション パッケージのバージョンを "1.0" に設定します。 - PersistOutputs プロジェクトを開始 (実行) します。
- サンプルの実行に使用する永続化テクノロジの選択を求められたら、「 2 」と入力して Batch サービス API を使用してサンプルを実行し、タスク出力を保持します。
- 必要に応じて、サンプルをもう一度実行し、「 3 」と入力して Batch サービス API で出力を保持し、ファイル規則の標準に従って宛先コンテナーと BLOB パスに名前を付けます。
次のステップ
- .NET のファイル規則ライブラリを使用したタスク出力の永続化の詳細については、「.NET 用 Batch ファイル規則ライブラリを使用してジョブとタスク のデータを Azure Storage に保持する」を参照してください。
- Azure Batch で出力データを保持するためのその他の方法については、「ジョブ とタスクの出力を Azure Storage に保持する」を参照してください。