Share via


Batch 計算ノードでのジョブの準備タスクと解放タスク

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

  • ジョブのタスクが実行される前に、1 つ以上のタスクの実行がスケジュールされているすべての計算ノードで、ジョブの準備タスクが実行されます。
  • ジョブが完了すると、ジョブの準備タスクを実行したプール内の各ノードで、ジョブの解放タスクが実行されます。

他の Batch タスクと同様に、ジョブの準備タスクまたは解放タスクの実行時に呼び出すコマンド ラインを指定できます。 ジョブの準備タスクと解放タスクでは、次のような使い慣れた Batch タスク機能が提供されます。

この記事では、Batch .NET ライブラリの JobPreparationTask クラスと JobReleaseTask クラスの使用方法について説明します。

ヒント

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

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

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

  • 共通のタスク データのダウンロード。 Batch ジョブでは通常、ジョブのタスクに対する入力として共通のデータ セットが必要になります。 ジョブの準備タスクを使用すると、ジョブの他のタスクの実行前にこのデータを各ノードにダウンロードできます。

    たとえば、毎日のリスク分析の計算で使用する市場データはジョブ固有ですが、そのジョブのすべてのタスクに共通です。 ジョブ準備タスクを使用すると、この市場データ (通常は数ギガバイト) を各計算ノードにダウンロードできます。これにより、ノードで実行されるすべてのタスクでこのデータを使用できるようになります。

  • ジョブとタスクの出力の削除。 ジョブ間でプールの計算ノードが使用停止されない共有プール環境では、実行と実行の間でジョブ データの削除が必要になる場合があります。 たとえば、ノード上のディスク領域の節約や、組織のセキュリティ ポリシーへの準拠が必要になることがあります。 ジョブの解放タスクを使用すると、ジョブの準備タスクでダウンロードされたデータ、またはタスクの実行で生成されたデータを削除できます。

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

ジョブの準備タスク

Batch では、ジョブのタスクが実行される前に、タスクの実行がスケジュールされている各計算ノードでジョブの準備タスクが実行されます。 既定では、ジョブの準備タスクが完了するまで待機してからスケジュールされたジョブ タスクが実行されますが、待機しないように構成することもできます。

ノードが再起動するとジョブの準備タスクも再度実行されますが、この動作を無効にすることもできます。 ジョブの準備タスクとジョブ マネージャー タスクが含まれるジョブがある場合、ジョブの準備タスクは、ジョブ マネージャー タスクやその他のすべてのタスクの前に実行されます。 ジョブの準備タスクは常に最初に実行されます。

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

Note

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

ジョブの解放タスク

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

Note

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

ジョブの解放タスクは、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. Terminate initiates the
// job release task on any node that ran job tasks. Note that the
// job release task also runs 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...

Note

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

Azure portal でジョブの準備タスクと解放タスクを表示する

Azure portalを使用して、ジョブの準備タスクと解放タスクを含む、Batch ジョブのプロパティとタスクを表示できます。 Batch アカウントのページで、左側のナビゲーションから [ジョブ] を選択し、ジョブを選択します。 サンプル アプリケーションを実行する場合は、タスクが完了してからジョブとプールを削除する前に、ジョブ ページに移動します。

ジョブの進行状況と状態を監視するには、ジョブの [概要] ページまたは [Tasks] (タスク) ページで [おおよそのタスク数] を展開します。

Azure portal でのジョブ タスクの進行状況を示すスクリーンショット。

次のスクリーンショットは、サンプル アプリケーションの実行後の JobPrepReleaseSampleJob ページを示しています。 このジョブには準備タスクと解放タスクが含まれていたため、左側のナビゲーションで [準備タスク] または [リリース タスク] を選択してそのプロパティを表示できます。

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

次のステップ