Batch コンピューティング ノードでのジョブ準備タスクとジョブ解放タスクの実行Run job preparation and job release tasks on Batch compute nodes

Azure Batch ジョブでは、タスクの実行前に何らかのセットアップが必要になることがよくあります。また、タスクが完了した後に、ジョブ実行後のメンテナンスが必要になることもよくあります。An Azure Batch job often requires some form of setup before its tasks are executed, and post-job maintenance when its tasks are completed. 場合によっては、タスクに共通する入力データをコンピューティング ノードにダウンロードしたり、ジョブの完了後にタスクの出力データを Azure Storage にアップロードしたりする必要があります。You might need to download common task input data to your compute nodes, or upload task output data to Azure Storage after the job completes. ジョブの準備タスクとジョブの解放タスクを使用して、これらの操作を実行できます。You can use job preparation and job release tasks to perform these operations.

ジョブの準備タスクと解放タスクWhat are job preparation and release tasks?

ジョブのタスクが実行される前に、1 つ以上のタスクの実行がスケジュールされているすべてのコンピューティング ノードで、ジョブの準備タスクが実行されます。Before a job's tasks run, the job preparation task runs on all compute nodes scheduled to run at least one task. ジョブが完了すると、少なくとも 1 つのタスクを実行したプールの各ノードでジョブ解放タスクが実行されます。Once the job is completed, the job release task runs on each node in the pool that executed at least one task. 通常の Batch タスクと同様に、ジョブの準備タスクまたは解放タスクが実行されるときに呼び出されるコマンド ラインを指定できます。As with normal Batch tasks, you can specify a command line to be invoked when a job preparation or release task is run.

ジョブの準備タスクとジョブの解放タスクは、ファイルのダウンロード (リソース ファイル)、管理者特権での実行、カスタム環境変数、最大実行期間、再試行回数、ファイルのリテンション期間などの使い慣れた Batch タスク機能を提供します。Job preparation and release tasks offer familiar Batch task features such as file download (resource files), elevated execution, custom environment variables, maximum execution duration, retry count, and file retention time.

以下のセクションでは、Batch .NET ライブラリの JobPreparationTask クラスと JobReleaseTask クラスの使用方法について説明します。In the following sections, you'll learn how to use the JobPreparationTask and JobReleaseTask classes found in the Batch .NET library.

ヒント

ジョブの準備タスクと解放タスクは、"共有プール" 環境で特に役に立ちます。この環境では、コンピューティング ノードのプールが異なるジョブの実行間で維持され、多くのジョブによって使用されます。Job preparation and release tasks are especially helpful in "shared pool" environments, in which a pool of compute nodes persists between job runs and is used by many jobs.

ジョブ準備タスクおよびジョブ解放タスクを使用するのに適した状況When to use job preparation and release tasks

ジョブの準備タスクと解放タスクは、次のような状況に適しています。Job preparation and job release tasks are a good fit for the following situations:

共通のタスク データのダウンロードDownload common task data

Batch ジョブでは、ジョブのタスクに対する入力として共通のデータ セットが必要になることがよくあります。Batch jobs often require a common set of data as input for the job's tasks. たとえば、毎日のリスク分析の計算では、市場データはジョブ固有ですが、そのジョブのすべてのタスクに共通です。For example, in daily risk analysis calculations, market data is job-specific, yet common to all tasks in the job. このような市場データはサイズが数ギガバイトになることも多く、各コンピューティング ノードに 1 回だけダウンロードして、そのノードで実行する各タスクがそれを使用できるようにする必要があります。This market data, often several gigabytes in size, should be downloaded to each compute node only once so that any task that runs on the node can use it. ジョブの準備タスク を使用して、ジョブの他のタスクの実行前に各ノードにこのデータをダウンロードします。Use a job preparation task to download this data to each node before the execution of the job's other tasks.

ジョブとタスクの出力の削除Delete job and task output

ジョブ間でプールのコンピューティング ノードが使用停止されない "共有プール" 環境では、実行と実行の間でジョブ データの削除が必要になる場合があります。In a "shared pool" environment, where a pool's compute nodes are not decommissioned between jobs, you may need to delete job data between runs. 場合によっては、ノードのディスク領域を節約したり、組織のセキュリティ ポリシーを満たしたりする必要があるためです。You might need to conserve disk space on the nodes, or satisfy your organization's security policies. ジョブの準備タスクによってダウンロードされたデータ、またはタスクの実行中に生成されたデータを削除するには、 ジョブの解放タスク を使用します。Use a job release task to delete data that was downloaded by a job preparation task, or generated during task execution.

ログのリテンション期間Log retention

タスクによって生成されるログ ファイルのコピーや、障害が発生したアプリケーションによって生成される可能性があるクラッシュ ダンプ ファイルの保持が必要な場合があります。You might want to keep a copy of log files that your tasks generate, or perhaps crash dump files that can be generated by failed applications. そのような場合は、ジョブ解放タスクを使用してこのデータを圧縮し、Azure Storage アカウントにアップロードします。Use a job release task in such cases to compress and upload this data to an Azure Storage account.

ヒント

ログ ファイルのほか、他のジョブやタスクの出力データを保持するもう 1 つの方法は、 Azure Batch ファイル規則 ライブラリを使用することです。Another way to persist logs and other job and task output data is to use the Azure Batch File Conventions library.

ジョブの準備タスクJob preparation task

ジョブのタスクを実行する前に、タスクの実行がスケジュールされている各コンピューティング ノードで、Batch によってジョブの準備タスクが実行されます。Before execution of a job's tasks, Batch executes the job preparation task on each compute node that is scheduled to run a task. 既定では、Batch サービスはジョブの準備タスクが完了するまで待機してから、ノードでスケジュールされているタスクを実行します。By default, the Batch service waits for the job preparation task to be completed before running the tasks scheduled to execute on the node. ただし、完了を待たないようにサービスを構成することもできます。However, you can configure the service not to wait. ノードが再起動するとジョブの準備タスクも再度実行されますが、この動作を無効にすることもできます。If the node restarts, the job preparation task runs again, but you can also disable this behavior.

ジョブの準備タスクは、タスクを実行するようにスケジュールされているノードでのみ実行されます。The job preparation task is executed only on nodes that are scheduled to run a task. これにより、ノードにタスクが割り当てられていない場合は、準備タスクが無駄に実行されることがなくなります。This prevents the unnecessary execution of a preparation task in case a node is not assigned a task. これは、ジョブのタスク数がプール内のノード数より少ない場合に発生する可能性があります。This can occur when the number of tasks for a job is less than the number of nodes in a pool. また、同時実行タスクの実行が有効になっている場合も当てはまります。この場合、タスク数が同時実行可能なタスクの総数より少ないと、一部のノードがアイドル状態のままになります。It also applies when concurrent task execution is enabled, which leaves some nodes idle if the task count is lower than the total possible concurrent tasks. アイドル状態のノードでジョブ準備タスクを実行しないことで、データ転送の費用を削減できます。By not running the job preparation task on idle nodes, you can spend less money on data transfer charges.

注意

JobPreparationTaskCloudPool.StartTask は異なります。JobPreparationTask が各ジョブの開始時に実行されるのに対し、StartTask はコンピューティング ノードが初めてプールに追加されたとき、または再起動したときにのみ実行されます。JobPreparationTask differs from CloudPool.StartTask in that JobPreparationTask executes at the start of each job, whereas StartTask executes only when a compute node first joins a pool or restarts.

ジョブの解放タスクJob release task

ジョブが完了とマークされると、少なくとも 1 つのタスクを実行したプールの各ノードでジョブ解放タスクが実行されます。Once a job is marked as completed, the job release task is executed on each node in the pool that executed at least one task. ジョブを完了済みとして指定するには、終了要求を発行します。You mark a job as completed by issuing a terminate request. それに対し、Batch サービスはジョブの状態を " 終了中" に設定し、ジョブに関連付けられているアクティブなタスクまたは実行中のタスクを終了してから、ジョブの解放タスクを実行します。The Batch service then sets the job state to terminating, terminates any active or running tasks associated with the job, and runs the job release task. その後、ジョブは 完了 状態に移行します。The job then moves to the completed state.

注意

ジョブを削除した場合もジョブ解放タスクが実行されます。Job deletion also executes the job release task. ただし、ジョブが既に終了している場合は、その後でジョブを削除しても解放タスクが再度実行されることはありません。However, if a job has already been terminated, the release task is not run a second time if the job is later deleted.

ジョブの解放タスクは、Batch サービスによって終了されるまでに最大 15 分間実行できます。Jobs release tasks can run for a maximum of 15 minutes before being terminated by the Batch service. 詳細については、REST API のリファレンス ドキュメントに関する記事を参照してください。For more information, see the REST API reference documentation.

Batch .NET でのジョブ準備タスクとジョブ解放タスクJob prep and release tasks with Batch .NET

ジョブの準備タスクを使用するには、JobPreparationTask オブジェクトをジョブの CloudJob.JobPreparationTask プロパティに割り当てます。To use a job preparation task, assign a JobPreparationTask object to your job's CloudJob.JobPreparationTask property. 同様に、ジョブの解放タスクを設定するには、JobReleaseTask を初期化し、それをジョブの CloudJob.JobReleaseTask プロパティに割り当てます。Similarly, initialize a JobReleaseTask and assign it to your job's CloudJob.JobReleaseTask property to set the job's release task.

次のコード スニペットで、myBatchClientBatchClient のインスタンス、myPool は Batch アカウント内の既存のプールです。In this code snippet, myBatchClient is an instance of BatchClient, and myPool is an existing pool within the Batch account.

// 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();

前に述べたとおり、解放タスクはジョブの終了時または削除時に実行されます。As mentioned earlier, the release task is executed when a job is terminated or deleted. JobOperations.TerminateJobAsync を使用してジョブを終了します。Terminate a job with JobOperations.TerminateJobAsync. JobOperations.DeleteJobAsync を使用してジョブを削除します。Delete a job with JobOperations.DeleteJobAsync. 通常は、タスクが完了したときか、定義したタイムアウトに達したときに、ジョブを終了または削除します。You typically terminate or delete a job when its tasks are completed, or when a timeout that you've defined has been reached.

// 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, thus you
// need not call Terminate if you typically delete jobs after task completion.
await myBatchClient.JobOperations.TerminateJobAsync("JobPrepReleaseSampleJob");

GitHub 上のサンプル コードCode sample on GitHub

ジョブの準備タスクとジョブの解放タスクの動作を確認するには、GitHub の JobPrepRelease サンプル プロジェクトをご覧ください。To see job preparation and release tasks in action, check out the JobPrepRelease sample project on GitHub. このコンソール アプリケーションは次のことを行います。This console application does the following:

  1. 2 つのノードを含むプールを作成します。Creates a pool with two nodes.
  2. ジョブ準備タスク、ジョブ解放タスク、標準タスクを含むジョブを作成します。Creates a job with job preparation, release, and standard tasks.
  3. ノードの "共有" ディレクトリ内のテキスト ファイルに最初にノード ID を書き込むジョブ準備タスクを実行します。Runs the job preparation task, which first writes the node ID to a text file in a node's "shared" directory.
  4. 同じテキスト ファイルにタスク ID を書き込むタスクを各ノードで実行します。Runs a task on each node that writes its task ID to the same text file.
  5. すべてのタスクが完了したら (またはタイムアウトに達したら)、各ノードのテキスト ファイルの内容をコンソールに出力します。Once all tasks are completed (or the timeout is reached), prints the contents of each node's text file to the console.
  6. ジョブが完了したら、ジョブ解放タスクを実行してノードからファイルを削除します。When the job is completed, runs the job release task to delete the file from the node.
  7. タスクを実行した各ノードのジョブ準備タスクとジョブ解放タスクの終了コードを出力します。Prints the exit codes of the job preparation and release tasks for each node on which they executed.
  8. ジョブまたはプールの削除を確認できるように実行を一時停止します。Pauses execution to allow confirmation of job and/or pool deletion.

サンプル アプリケーションからの出力は次のようになります。Output from the sample application is similar to the following:

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...

注意

新しいプールにノードが作成されて起動されるタイミングは不定である (一部のノードだけ他のノードよりも早く、タスクを処理できる状態になることがある) ため、出力結果が異なる場合があります。Due to the variable creation and start time of nodes in a new pool (some nodes are ready for tasks before others), you may see different output. たとえばタスクの実行には時間がかからないので、ジョブのすべてのタスクがプール内のいずれか 1 つのノードによって実行される可能性もあります。Specifically, because the tasks complete quickly, one of the pool's nodes may execute all of the job's tasks. このとき、タスクを実行しなかったノードについては、ジョブの準備タスクとジョブの解放タスクが存在しません。If this occurs, you will notice that the job prep and release tasks do not exist for the node that executed no tasks.

Azure Portal でのジョブの準備タスクと解放タスクの確認Inspect job preparation and release tasks in the Azure portal

サンプル アプリケーションを実行する際、Azure Portal を使用して、ジョブとそのタスクのプロパティを表示したり、ジョブのタスクによって変更された共有テキスト ファイルをダウンロードしたりできます。When you run the sample application, you can use the Azure portal to view the properties of the job and its tasks, or even download the shared text file that is modified by the job's tasks.

以下のスクリーンショットは、サンプル アプリケーション実行後の Azure Portal の [準備タスク] ブレードです。The screenshot below shows the Preparation tasks blade in the Azure portal after a run of the sample application. タスクの完了後 (ただし、ジョブとプールが削除される前)、JobPrepReleaseSampleJob プロパティに移動し、 [準備タスク] または [リリース タスク] をクリックして、それらのプロパティを表示します。Navigate to the JobPrepReleaseSampleJob properties after your tasks have completed (but before deleting your job and pool) and click Preparation tasks or Release tasks to view their properties.

Job preparation properties in Azure portal

次の手順Next steps

アプリケーション パッケージApplication packages

タスクの実行に使用するコンピューティング ノードは、ジョブの準備タスクのほか、Batch の アプリケーション パッケージ 機能を使用して準備することもできます。In addition to the job preparation task, you can also use the application packages feature of Batch to prepare compute nodes for task execution. この機能は特に、インストーラーの実行を必要としないアプリケーションや、多数 (100 個超) のファイルを含んだアプリケーション、厳密なバージョン管理が要求されるアプリケーションをデプロイする場合に利便性を発揮します。This feature is especially useful for deploying applications that do not require running an installer, applications that contain many (100+) files, or applications that require strict version control.

アプリケーションとステージング データのインストールInstalling applications and staging data

この MSDN フォーラムの投稿では、タスクの実行に使用するノードの準備方法の概要をいくつか示しています。This MSDN forum post provides an overview of several methods of preparing your nodes for running tasks:

Batch コンピューティング ノードでのアプリケーションとステージング データのインストールInstalling applications and staging data on Batch compute nodes

Azure Batch チームのメンバーによって投稿されたもので、コンピューティング ノードへのアプリケーションとデータのデプロイに使用できるいくつかの手法について説明しています。Written by one of the Azure Batch team members, it discusses several techniques that you can use to deploy applications and data to compute nodes.