Batch コンピューティング ノードでのジョブ準備タスクとジョブ解放タスクの実行

Azure Batch のジョブでは、タスクを実行する前に何らかの形式のセットアップが必要になることがよくあります。 また、タスクの完了時にジョブ実行後のメンテナンスが必要になる場合もあります。 たとえば、タスクに共通する入力データをコンピューティング ノードにダウンロードしたり、ジョブの完了後にタスクの出力データを Azure Storage にアップロードしたりすることが必要になる場合があります。 ジョブの準備 タスクと ジョブの解放 タスクを使用して、これらの操作を実行できます。

ジョブの準備タスクと解放タスク

ジョブのタスクが実行される前に、1 つ以上のタスクの実行がスケジュールされているすべてのコンピューティング ノードで、ジョブの準備タスクが実行されます。 ジョブが完了すると、少なくとも 1 つのタスクを実行したプールの各ノードでジョブ解放タスクが実行されます。 通常の Batch タスクと同様に、ジョブの準備タスクまたは解放タスクが実行されるときに呼び出されるコマンド ラインを指定できます。

ジョブの準備タスクとジョブの解放タスクは、ファイルのダウンロード (リソース ファイル)、管理者特権での実行、カスタム環境変数、最大実行期間、再試行回数、ファイルのリテンション期間などの使い慣れた Batch タスク機能を提供します。

以下のセクションでは、Batch .NET ライブラリの JobPreparationTask クラスと JobReleaseTask クラスの使用方法について説明します。

ヒント

ジョブの準備タスクと解放タスクは、"共有プール" 環境で特に役に立ちます。この環境では、コンピューティング ノードのプールが異なるジョブの実行間で維持され、多くのジョブによって使用されます。

ジョブ準備タスクおよびジョブ解放タスクを使用するのに適した状況

ジョブの準備タスクと解放タスクは、次のような状況に適しています。

  • 共通タスク データのダウンロード: Batch ジョブでは、ジョブのタスクに対する入力として共通のデータ セットが必要になることがよくあります。 たとえば、毎日のリスク分析の計算では、市場データはジョブ固有ですが、そのジョブのすべてのタスクに共通です。 このような市場データはサイズが数ギガバイトになることも多く、各コンピューティング ノードに 1 回だけダウンロードして、そのノードで実行する各タスクがそれを使用できるようにする必要があります。 ジョブの準備タスク を使用して、ジョブの他のタスクの実行前に各ノードにこのデータをダウンロードします。

  • ジョブとタスクの出力の削除: ジョブの合間にプールのコンピューティング ノードが使用停止されない "共有プール" 環境では、実行の合間にジョブ データの削除が必要になる場合があります。 場合によっては、ノードのディスク領域を節約したり、組織のセキュリティ ポリシーを満たしたりする必要があるためです。 ジョブの準備タスクによってダウンロードされた、またはタスクの実行中に生成されたデータを削除するには、ジョブの解放タスク を使用します。

  • ログの保有期間: タスクによって生成されるログ ファイルのコピーや、障害が発生したアプリケーションによって生成される可能性があるクラッシュ ダンプ ファイルの保持が必要な場合があります。 そのような場合は、ジョブの解放タスク を使用してこのデータを圧縮し、Azure ストレージ アカウントにアップロードします。

ジョブの準備タスク

ジョブのタスクを実行する前に、タスクを実行するようにスケジュールされている各コンピューティング ノードで、Batch によってジョブの準備タスクが実行されます。 既定では、Batch では、ジョブの準備タスクが完了するまで待機してから、ノード上で実行するようにスケジュールされたタスクが実行されます。 ただし、完了を待たないようにサービスを構成することもできます。 ノードが再起動されると、ジョブの準備タスクが再度実行されます。 また、この動作を無効にすることもできます。 ジョブの準備タスクとジョブ マネージャー タスクが構成されたジョブがある場合、他のすべてのタスクと同様に、ジョブの準備タスクはジョブ マネージャー タスクの前に実行されます。 ジョブの準備タスクは常に最初に実行されます。

ジョブの準備タスクは、タスクを実行するようにスケジュールされているノードでのみ実行されます。 これにより、ノードにタスクがまったく割り当てられていない場合に、準備タスクが無駄に実行されることがなくなります。 これは、ジョブのタスク数がプール内のノード数より少ない場合に発生する可能性があります。 また、同時実行タスクの実行が有効になっている場合も当てはまります。この場合、タスク数が同時実行可能なタスクの総数より少ないと、一部のノードがアイドル状態のままになります。

注意

JobPreparationTaskCloudPool.StartTask は異なります。JobPreparationTask が各ジョブの開始時に実行されるのに対し、StartTask はコンピューティング ノードが初めてプールに追加されたとき、または再起動したときにのみ実行されます。

ジョブの解放タスク

ジョブが完了済みとしてマークされると、少なくとも 1 つのタスクを実行したプールの各ノードでジョブの解放タスクが実行されます。 ジョブを完了済みとして指定するには、終了要求を発行します。 この要求は、ジョブの状態を "終了中" に設定し、ジョブに関連付けられているアクティブなタスクまたは実行中のタスクを終了してから、ジョブの解放タスクを実行します。 その後、ジョブは 完了 状態に移行します。

注意

ジョブを削除した場合も、ジョブの解放タスクが実行されます。 ただし、ジョブが既に終了している場合は、その後でジョブを削除しても解放タスクが再度実行されることはありません。

ジョブの解放タスクは、Batch サービスによって終了されるまでに最大 15 分間実行できます。 詳細については、REST API のリファレンス ドキュメントに関する記事を参照してください。

Batch .NET でのジョブ準備タスクとジョブ解放タスク

ジョブの準備タスクを使用するには、JobPreparationTask オブジェクトをジョブの CloudJob.JobPreparationTask プロパティに割り当てます。 同様に、ジョブの解放タスクを使用するには、JobReleaseTask を初期化し、それをジョブの CloudJob.JobReleaseTask に割り当てます。

次のコード スニペットで、myBatchClientBatchClient のインスタンス、myPool は Batch アカウント内の既存のプールです。

// Create the CloudJob for CloudPool "myPool"
CloudJob myJob =
    myBatchClient.JobOperations.CreateJob(
        "JobPrepReleaseSampleJob",
        new PoolInformation() { PoolId = "myPool" });

// Specify the command lines for the job preparation and release tasks
string jobPrepCmdLine =
    "cmd /c echo %AZ_BATCH_NODE_ID% > %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";
string jobReleaseCmdLine =
    "cmd /c del %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";

// Assign the job preparation task to the job
myJob.JobPreparationTask =
    new JobPreparationTask { CommandLine = jobPrepCmdLine };

// Assign the job release task to the job
myJob.JobReleaseTask =
    new JobReleaseTask { CommandLine = jobReleaseCmdLine };

await myJob.CommitAsync();

前に述べたとおり、解放タスクはジョブの終了時または削除時に実行されます。 JobOperations.TerminateJobAsync を使用してジョブを終了しますJobOperations.DeleteJobAsync を使用してジョブを削除します。 通常は、タスクが完了したときか、定義したタイムアウトに達したときに、ジョブを終了または削除します。

// Terminate the job to mark it as completed; this will initiate the
// job release task on any node that executed job tasks. Note that the
// job release task is also executed when a job is deleted, so you don't
// have to call Terminate if you delete jobs after task completion.

await myBatchClient.JobOperations.TerminateJobAsync("JobPrepReleaseSampleJob");

GitHub 上のサンプル コード

ジョブの準備タスクとジョブの解放タスクの動作を確認するには、GitHub の JobPrepRelease サンプル プロジェクトをご覧ください。 このコンソール アプリケーションは次のことを行います。

  1. 2 つのノードを含むプールを作成します。
  2. ジョブ準備タスク、ジョブ解放タスク、標準タスクを含むジョブを作成します。
  3. ノードの "共有" ディレクトリ内のテキスト ファイルに最初にノード ID を書き込むジョブ準備タスクを実行します。
  4. 同じテキスト ファイルにタスク ID を書き込むタスクを各ノードで実行します。
  5. すべてのタスクが完了したら (またはタイムアウトに達したら)、各ノードのテキスト ファイルの内容をコンソールに出力します。
  6. ジョブが完了したら、ジョブ解放タスクを実行してノードからファイルを削除します。
  7. タスクを実行した各ノードのジョブ準備タスクとジョブ解放タスクの終了コードを出力します。
  8. ジョブまたはプールの削除を確認できるように実行を一時停止します。

サンプル アプリケーションからの出力は次のようになります。

Attempting to create pool: JobPrepReleaseSamplePool
Created pool JobPrepReleaseSamplePool with 2 nodes
Checking for existing job JobPrepReleaseSampleJob...
Job JobPrepReleaseSampleJob not found, creating...
Submitting tasks and awaiting completion...
All tasks completed.

Contents of shared\job_prep_and_release.txt on tvm-2434664350_1-20160623t173951z:
-------------------------------------------
tvm-2434664350_1-20160623t173951z tasks:
  task001
  task004
  task005
  task006

Contents of shared\job_prep_and_release.txt on tvm-2434664350_2-20160623t173951z:
-------------------------------------------
tvm-2434664350_2-20160623t173951z tasks:
  task008
  task002
  task003
  task007

Waiting for job JobPrepReleaseSampleJob to reach state Completed
...

tvm-2434664350_1-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

tvm-2434664350_2-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

Delete job? [yes] no
yes
Delete pool? [yes] no
yes

Sample complete, hit ENTER to exit...

注意

新しいプールにノードが作成されて起動されるタイミングは不定である (一部のノードだけ他のノードよりも早く、タスクを処理できる状態になることがある) ため、出力結果が異なる場合があります。 たとえばタスクの実行には時間がかからないので、ジョブのすべてのタスクがプール内のいずれか 1 つのノードによって実行される可能性もあります。 このとき、タスクを実行しなかったノードについては、ジョブの準備タスクとジョブの解放タスクが存在しません。

Azure Portal でのジョブの準備タスクと解放タスクの確認

ジョブとそのタスクのプロパティは、Azure portal を使用して確認できます。 サンプル アプリケーションを実行した後で、そのジョブのタスクで変更された共有テキスト ファイルをダウンロードすることもできます。

次のスクリーンショットに、Azure portal の 準備タスク ブレード を示します。 タスクの完了後 (ただし、ジョブとプールが削除される前)、JobPrepReleaseSampleJob プロパティに移動し、[準備タスク] または [リリース タスク] をクリックして、それらのプロパティを表示します。

Azure portal のジョブの準備タスク プロパティを示すスクリーンショット。

次のステップ