次の方法で共有


.NET 用 Batch ファイル規則ライブラリを使用してジョブとタスクのデータを Azure Storage に保持する

Azure Batch で実行されているタスクでは、実行時に出力データが生成される場合があります。 多くの場合、タスク出力データは、ジョブ内の他のタスク、ジョブを実行したクライアント アプリケーション、またはその両方で取得するために格納する必要があります。 タスクは Batch コンピューティング ノードのファイル システムに出力データを書き込みますが、ノードが再イメージ化されたとき、またはノードがプールを離れると、ノード上のすべてのデータが失われます。 また、タスクにはファイルの保持期間があり、その後、タスクによって作成されたファイルが削除されます。 このような理由から、後で必要になるタスク出力を Azure Storage などのデータ ストアに保持することが重要です。

Batch のストレージ アカウント オプションについては、「 Batch アカウントと Azure Storage アカウント」を参照してください。

.NET 用のファイル規則ライブラリを使用して、Azure Batch からタスク データを保持できます。 ファイル規則ライブラリを使用すると、Azure Storage にタスク出力データを格納および取得するプロセスが簡略化されます。 ファイル規則ライブラリは、タスク コードとクライアント コードの両方で使用できます。 タスク モードでは、ライブラリを使用してファイルを保持します。 クライアント モードでは、ライブラリを使用してファイルを一覧表示および取得します。 タスク コードでは、タスク の依存関係 のシナリオなど、ライブラリを使用してアップストリーム タスクの出力を取得することもできます。

ファイル規則ライブラリを使用して出力ファイルを取得するには、ジョブまたはタスクのファイルを見つけます。 ファイルの名前や場所を知る必要はありません。 代わりに、ID と目的でファイルを一覧表示できます。 たとえば、特定のタスクのすべての中間ファイルを一覧表示します。 または、特定のジョブのプレビュー ファイルを取得します。

バージョン 2017-05-01 以降、Batch サービス API は、仮想マシン (VM) 構成で作成されたプールで実行されるタスクとジョブ マネージャー タスクの出力データを Azure Storage に保持することをサポートしています。 タスクを作成するコード内から出力を保持できます。 このメソッドは、ファイル規則ライブラリの代わりに使用できます。 Batch クライアント アプリケーションを変更して出力を保持できます。タスクが実行されているアプリケーションを更新する必要はありません。 詳細については、「Persist task data to Azure Storage with the Batch service API (Batch サービス API を使用した Azure Storage へのタスクのデータの保持)」を参照してください。

ライブラリのユース ケース

Azure Batch には、タスク出力を保持する複数の方法が用意されています。 次の場合は、ファイル規則ライブラリを使用します。

  • タスクが実行されているアプリケーションのコードを変更して、ファイルを保持します。
  • タスクの実行中に Azure Storage にデータをストリーミングします。
  • プールからのデータを保持します。
  • クライアント アプリケーションまたはその他のタスクで、ID または目的別にタスク出力ファイルを見つけてダウンロードします。
  • Azure portal でタスクの出力を表示します

その他のシナリオでは、別のアプローチを検討する必要があります。 その他のオプションの詳細については、「 ジョブとタスクの出力を Azure Storage に保持する」を参照してください。

Batch ファイル規則の標準とは

Batch ファイル規則標準では、出力ファイルの書き込み先となるコンテナーと BLOB パスの名前付けスキームが提供されます。 標準に従う Azure Storage に永続化されたファイルは、 Azure portal で自動的に表示されます

.NET のファイル規則ライブラリは、標準に従ってストレージ コンテナーとタスク出力ファイルに自動的に名前を付けます。 このライブラリには、Azure Storage の出力ファイルに対してクエリを実行するメソッドも用意されています。 ジョブ ID、タスク ID、または目的でクエリを実行できます。

.NET 以外の言語で開発している場合は、アプリケーションでファイル規則標準を自分で実装できます。 詳細については、「 Batch ファイル規則標準の実装」を参照してください。

ファイル規則ライブラリを使用して出力データを Azure Storage に保持するには、まず Azure Storage アカウントを Batch アカウントにリンクします。

  1. Azure portal にサインインします。
  2. 検索バーで Batch を検索して選択します。
  3. Azure Storage にリンクする Batch アカウントを選択します。
  4. [Batch アカウント] ページの [設定] で、[ ストレージ アカウント] を選択します。
  5. Batch アカウントに関連付けられている Azure Storage アカウントがまだない場合は、[ ストレージ アカウント (なし)] を選択します。
  6. 使用する Azure Storage アカウントを選択します。 最適なパフォーマンスを得る場合は、Batch アカウントと同じリージョンのアカウントを使用します。

出力データを保持する

ファイル規則ライブラリを使用して、ジョブとタスクの出力データを保持できます。 まず、Azure Storage にコンテナーを作成します。 次に、出力をコンテナーに保存します。 タスク コードで .NET 用 Azure Storage クライアント ライブラリ を使用して、タスクの出力をコンテナーにアップロードします。

Azure Storage でのコンテナーと BLOB の操作の詳細については、「 .NET を使用した Azure Blob Storage の概要」を参照してください。

ファイル規則ライブラリで保持されているすべてのジョブとタスクの出力は、同じコンテナーに格納されます。 多数のタスクが同時にファイルを保持しようとすると、Azure Storage の調整制限が適用される可能性があります。 詳細については、 Blob Storage のパフォーマンスとスケーラビリティのチェックリストを参照してください。

ストレージ コンテナーを作成する

Azure Storage にタスク出力を保持するには、まず CloudJob を呼び出してコンテナーを作成します。PrepareOutputStorageAsync。 この拡張メソッドは、 CloudStorageAccount オブジェクトをパラメーターとして受け取ります。 このメソッドは、ファイル規則標準に従って名前付きのコンテナーを作成します。 コンテナーの内容は、Azure portal と、この記事で説明する取得方法で検出できます。

通常は、プール、ジョブ、タスクを作成するコンテナーをクライアント アプリケーションに作成します。 例えば次が挙げられます。

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");

TaskOutputStoragekind パラメーター。SaveAsync メソッドは、永続化されたファイルを分類します。 定義済みの TaskOutputKind 型には、 TaskOutputTaskPreviewTaskLogTaskIntermediate. の 4 種類があります。また、出力のカスタム カテゴリを定義することもできます。

後で Batch にクエリを実行するときに一覧表示する出力の種類を指定します。 次に、タスクの出力を一覧表示するときに、出力の種類のいずれかをフィルター処理できます。 たとえば、"Give me the preview output for task 109" (タスク 109プレビュー出力を表示する) というフィルターを適用します。詳細については、出力データの取得を参照してください。

出力の種類によって、 Azure portal での出力ファイルの表示場所も決まります。 TaskOutput カテゴリのファイルは、タスク出力ファイルの下にあります。 TaskLog カテゴリのファイルは、タスク ログの下にあります。

ジョブの出力の格納

ジョブ全体に関連付けられている出力を格納することもできます。 たとえば、ムービー レンダリング ジョブのマージ タスクでは、完全にレンダリングされたムービーをジョブ出力として保持できます。 ジョブが完了すると、クライアント アプリケーションはジョブの出力を一覧表示および取得できます。 クライアント アプリケーションは、個々のタスクに対してクエリを実行する必要はありません。

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 型には、出力カテゴリとプレビュー カテゴリの両方が含まれます。 この型では、カスタム カテゴリの作成もサポートされています。

タスク ログを格納する

また、タスクの実行中に更新されたファイルを保持する必要がある場合もあります。 たとえば、ログ ファイルを保持したり、 stdout.txtstderr.txtしたりする必要がある場合があります。 ファイル規則ライブラリは TaskOutputStorage を提供します。SaveTrackedAsync メソッドを使用して、これらの種類のファイルを保持します。 SaveTrackedAsync を使用して、指定した間隔でノード上のファイルの更新を追跡します。 次に、これらの更新を Azure Storage に保持します。

次の例では 、SaveTrackedAsync を 使用して、タスクの実行中に Azure Storage の stdout.txt を 15 秒ごとに更新します。

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);
}

コメントされたセクション Code to process data and produce output file(s) を、タスクが通常行うコードに置き換えます。 たとえば、Azure Storage からデータをダウンロードし、変換や計算を実行するコードがあるとします。 このコードを using ブロックにラップして、 SaveTrackedAsync を使用してファイルを定期的に更新できます。

ノード エージェントは、プール内の各ノードで実行されるプログラムです。 このプログラムは、ノードと Batch サービスの間のコマンドおよび制御インターフェイスを提供します。 このusing ブロックの末尾には、Task.Delay呼び出しが必要です。 この呼び出しにより、ノード エージェントが標準の内容をノード上の stdout.txt ファイルにフラッシュする時間があることを確認します。 この遅延がなければ、最後の数秒の出力を見逃す可能性があります。 すべてのファイルにこの遅延は必要ない場合があります。

SaveTrackedAsync を使用してファイルの追跡を有効にすると、追跡対象のファイルへの追加のみが 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 portal で出力ファイルを表示する

タスク出力ファイルで Batch ファイル規則標準を使用している場合は、Azure portal でファイルを表示できます。

ポータルで出力ファイルの表示を有効にするには、次の要件を満たす必要があります。

出力ファイルを Azure portal に自動的に表示するには、次の手順を実行する必要があります。

  1. Azure Storage アカウントを Batch アカウントにリンクします
  2. Azure Storage のコンテナーとファイルの定義済みの名前付け規則に従います。 すべての定義については、README を確認してください。 ファイル規則ライブラリを使用して出力を保持する場合、ファイルはファイル規則の標準に従って保持されます。

Azure portal でタスクの出力ファイルとログを表示するには:

  1. Azure portal にサインインします。
  2. 出力を表示するタスクに移動します。
  3. [ 保存された出力ファイル] または [ 保存されたログ] を選択します。

コード サンプル

PersistOutputs サンプル プロジェクトは、GitHub の Azure Batch コード サンプルの 1 つです。 この Visual Studio ソリューションでは、Azure Batch ファイル規則ライブラリを使用して、タスクの出力を永続ストレージに保持する方法を示します。 サンプルを実行するには、次の手順に従います。

  1. Visual Studio 2019 でプロジェクトを開きます。
  2. Batch と Azure Storage アカウントの資格情報を、Microsoft.Azure.Batch.Samples.Common プロジェクトの AccountSettings.settings に追加します。
  3. ソリューションをビルドします。 ソリューションをまだ実行しないでください。
  4. メッセージが表示されたら、NuGet パッケージを復元します。
  5. Azure portal を使用して PersistOutputsTask 用のアプリケーション パッケージをアップロードします。
    1. PersistOutputsTask.exe実行可能ファイルとその依存アセンブリを .zip パッケージに含めます。
    2. アプリケーション ID を PersistOutputsTask に設定します。
    3. アプリケーション パッケージのバージョンを 1.0 に設定します。
  6. [開始] を選択してプロジェクトを実行します。
  7. 使用する永続化テクノロジの選択を求められたら、「1」と入力 します。 このオプションでは、ファイル規則ライブラリを使用してサンプルを実行し、タスクの出力を保持します。

.NET 用の Batch ファイル規則ライブラリを取得する

.NET 用の Batch ファイル規則ライブラリは 、NuGet で使用できます。 このライブラリは、 CloudJob クラスと CloudTask クラスを 新しいメソッドで拡張します。 詳細については、 ファイル規則ライブラリのリファレンス ドキュメントを参照してください

ファイル規則ライブラリのソース コードは、GitHub で入手できます。

次のステップ