Azure Batch では、タスクは計算の単位を表します。 ジョブはこれらのタスクをまとめたものです。 この記事では、ジョブとタスク、およびジョブとタスクがAzure Batch ワークフローでどのように使用されるかについて説明します。
ジョブ
ジョブはタスクのコレクションです。 プール内のコンピューティング ノード上で行う計算をそれらのタスクでどのように実行するかを管理します。
ジョブによって、作業が実行されるプールが指定されます。 ジョブごとに新しくプールを作成できるほか、多数のジョブに対して 1 つのプールを使用することもできます。 ジョブ スケジュールに関連付けられているジョブごとにプールを作成するか、ジョブ スケジュールに関連付けられているすべてのジョブに対して 1 つのプールを作成してください。
ジョブの優先順位
作成するジョブには、オプションの優先順位を割り当てることができます。 Batch サービスは、ジョブの優先順位を使用して、各プール内の (ジョブ内のすべてのタスクの) スケジューリングの順序を決定します。
ジョブの優先度を更新するには、ジョブのプロパティを更新操作 (Batch REST) を呼び出すか、BatchJob.Priority (Azure.Compute.Batch) を変更します。 優先順位の値の範囲は、-1,000 (最も低い優先順位) から +1,000 (最も高い優先順位) までです。
同じプール内で、優先順位の高いジョブは優先順位の低いジョブよりも優先的にスケジュールされます。 すでに実行中の優先順位の低いジョブのタスクが、優先順位の高いジョブのタスクによって割りこまれることはありません。 同じ優先度レベルのジョブがスケジュールされる可能性が同じであり、タスク実行の順序は定義されていません。
1 つのプールで実行されている優先順位の高いジョブは、別のプールや別の Batch アカウントで実行されているジョブのスケジューリングに影響を与えません。 ジョブの優先順位は、ジョブの送信時に作成される autopools には適用されません。
ジョブの制約
ジョブに対する特定の制限は、ジョブの制約を使用して指定できます。
- 最大実時間を設定できます。この場合、ジョブの実行時間が、指定された最大実時間を超えると、ジョブとそのすべてのタスクが強制的に終了されます。
- タスク再試行の最大回数を制約として指定できます。タスクを常に再試行するように指定したり、再試行を禁止したりすることもできます。 タスクを再試行すると、タスクが失敗した場合は、再度実行するようにキューに戻されます。
ジョブ マネージャーのタスクと自動終了
クライアント アプリケーションでジョブにタスクを追加するか、ジョブ マネージャー タスクを指定することができます。 ジョブ マネージャー タスクには、ジョブに必要なタスクを作成するための情報と、プール内のいずれかのコンピューティング ノードで実行されているジョブ マネージャー タスクが含まれます。 ジョブ マネージャー タスクは、特に Batch によって処理されます。ジョブは、ジョブが作成されるとすぐにキューに登録され、失敗した場合は再起動されます。 ジョブ スケジュールによって作成されたジョブには、ジョブ マネージャー タスクが必要です。ジョブ マネージャー タスク以外では、ジョブがインスタンス化される前にタスクを定義できないためです。
既定では、ジョブ内のすべてのタスクが完了しても、ジョブはアクティブな状態のままとなります。 この動作は変更可能です。ジョブ内のすべてのタスクが完了したときにジョブが自動的に終了するように設定できます。 ジョブの onAllTasksComplete プロパティ(Azure.Compute.Batch では OnAllTasksComplete)を terminatejob に設定して、すべてのタスクが完了状態になったときにジョブが自動的に終了するようにします。
Batch サービスでは、タスクの "ない" ジョブを考慮して、そのすべてのタスクを完了させます。 したがって、このオプションは、 ジョブ マネージャー タスクで最も一般的に使用されます。 ジョブ マネージャーなしでジョブの自動終了を使用する場合は、最初に新しいジョブの onAllTasksComplete プロパティを noactionに設定し、ジョブへのタスクの追加が完了した後にのみ terminatejob に設定する必要があります。
スケジュールされたジョブ
ジョブ スケジュールを使用すると、Batch サービス内に、繰り返し発生するジョブを作成できます。 ジョブ スケジュールは、ジョブをいつ実行するかを指定し、実行されるジョブの仕様を持っています。 スケジュールがスケジュール期間 (スケジュールが有効になる時点とその期間) と、その期間中にどのくらいの頻度でジョブを作成するかを指定することができます。
タスク
タスクは、ジョブに関連付けられた計算の単位です。 タスクはノードで実行されます。 タスクはノードに割り当てられて実行されるか、ノードが解放されるまでキューに格納されます。 つまりコンピューティング ノード上にある 1 つ以上のプログラム (またはスクリプト) をタスクが実行することによって、必要な作業が遂行されます。
タスクを作成するときに、次の情報を指定できます。
タスクのコマンド ライン。 コンピューティング ノード上のアプリケーションまたはスクリプトを実行するコマンド ラインとして使用されます。
コマンド ラインはシェルの下では実行されない点に注意してください。 したがって、 環境変数 の拡張などのシェル機能をネイティブに利用することはできません (これには
PATHが含まれます)。 こうした機能を利用するには、コマンド ラインでシェルを呼び出す必要があります。たとえば、次のように Windows ノードではcmd.exeを、Linux では/bin/shを起動します。cmd /c MyTaskApplication.exe %MY_ENV_VAR%/bin/sh -c MyTaskApplication $MY_ENV_VARノードの
PATHまたは参照環境変数にないアプリケーションまたはスクリプトをタスクで実行する必要がある場合は、タスクのコマンド ラインでシェルを明示的に呼び出します。リソース ファイル 。 これらのファイルは、タスクのコマンド ラインが実行される前に、Azure ストレージ アカウントの BLOB ストレージからノードに自動的にコピーされます。 詳細については、「開始タスク」と「ファイルとディレクトリ」をご覧ください。
アプリケーションで必要な 環境変数 。 詳細については、「タスクの環境設定」をご覧ください。
タスクを実行する際の 制約 。 この制約には、タスクの実行が許可される最大時間、タスクが失敗した場合に再試行する最大回数、タスクの作業ディレクトリにファイルを保持する最大時間などがあります。
タスクの実行がスケジュールされているコンピューティング ノードにデプロイするアプリケーション パッケージ。 アプリケーション パッケージにより、タスクによって実行されるアプリケーションのデプロイとバージョン管理がシンプルになります。 タスク レベルのアプリケーション パッケージは、1 つのプールで異なるジョブが実行され、ジョブの完了時にプールが削除されない共有プール環境で特に便利です。 ジョブ内のタスクがプール内のノードよりも少ない場合は、タスクのアプリケーション パッケージによりデータ転送を最小限に抑えることができます。アプリケーションはタスクが実行されるノードにのみデプロイされるためです。
Docker Hub またはプライベート レジストリ内のコンテナー イメージ参照、およびタスクがノード上で実行される Docker コンテナーを作成するための追加設定。 この情報は、プールがコンテナー構成で設定されている場合にのみ指定します。
注
タスクの最長有効期間 (ジョブに追加されてから完了するまで) は、180 日間です。 完了したタスクは 7 日間保持されます。最大有効期間内に完了していないタスクのデータにはアクセスできません。
Batch サービスには、ノードで計算を実行するために定義するタスクに加えて、複数の特殊なタスクも用意されています。
開始タスク
開始タスクをプールに関連付けることによって、ノードの動作環境を準備できます。 たとえば、タスクで実行するアプリケーションのインストールやバックグラウンド プロセスの開始などのアクションを実行できます。 開始タスクは、プール内に保持される限り、ノードが開始されるたびに実行されます。 これには、ノードが最初にプールに追加されるときや、ノードが再起動または再イメージ化されるときがあります。
開始タスクの主な利点は、コンピューティング ノードの構成に必要なすべての情報を集約し、タスクの実行に必要なアプリケーションをインストールできることです。 このため、新しいターゲット ノードの数を指定するのと同じくらい簡単にプール内のノードの数を増やすことができます。 新しいノードの構成と、タスクを受け取る準備に Batch サービスに必要な情報は、開始タスクから提供されます。
すべての Azure Batch タスクと同様、実行するコマンド ラインのほかに、Azure Storage 内のリソース ファイルの一覧を指定できます。 Batch サービスは、リソース ファイルを Azure Storage からノードにコピーした後でコマンド ラインを実行します。 プールの開始タスクの場合、このファイル一覧にはタスクのアプリケーションとその依存関係を含めるのが一般的です。
ただし、開始タスクにはコンピューティング ノードで実行されるすべてのタスク用の参照データを含めることもできます。 たとえば、開始タスクのコマンド ラインで robocopy 操作を実行し、(リソース ファイルとして指定され、ノードにダウンロードされた) アプリケーション ファイルを開始タスクの作業ディレクトリから共有フォルダーにコピーしたうえで、MSI または setup.exe を実行することができます。
一般的には、Batch サービスが開始タスクの完了まで待ってから、タスクを割り当てられる状態になっているノードを判断することが望ましいものの、 これは、必要に応じて、さまざまな方法で構成することができます。
コンピューティング ノードで開始タスクが失敗した場合、ノードの状態はエラーを反映するように更新され、ノードにはタスクが割り当てられません。 開始タスクは、ストレージからリソース ファイルをコピーする際に問題が発生した場合、またはコマンド ラインによって実行されたプロセスから 0 以外の終了コードが返された場合に失敗する可能性があります。
既存のプールの開始タスクを追加または更新するには、そのコンピューティング ノードを再起動して、開始タスクがノードに適用されるようにする必要があります。
注
バッチでは、リソース ファイルと環境変数を含む開始タスクの合計サイズが制限されます。 開始タスクのサイズを縮小する必要がある場合は、次の 2 つの方法のいずれかを利用できます。
アプリケーション パッケージを使って、Batch プール内の各ノードにアプリケーションまたはデータを分散させることができます。 アプリケーション パッケージについて詳しくは、「Batch アプリケーション パッケージを使用したコンピューティング ノードへのアプリケーションのデプロイ」をご覧ください。
アプリケーション ファイルが含まれた zip アーカイブを手動で作成することができます。 zip アーカイブを Azure Storage に BLOB としてアップロードします。 zip アーカイブを開始タスクのリソース ファイルとして指定します。 開始タスクのコマンド ラインを実行する前に、コマンド ラインから zip アーカイブを解凍します。
zip アーカイブの解凍には、任意のアーカイブ ツールを使用してかまいません。 開始タスクのリソース ファイルとしてアーカイブを解凍するために使用するツールを含める必要があります。
ジョブ マネージャー タスク
ジョブ マネージャー タスクの通常の用途は、ジョブの実行の制御や監視です。 たとえば、ジョブに対してタスクを作成および送信する場合や、追加で実行するタスクを決める場合、どの時点で作業が完了するかを決める場合などにジョブ マネージャー タスクを使用します。
ただし、ジョブ マネージャー タスクはこれらのアクティビティに制限されません。 これは、ジョブに必要なすべてのアクションを実行できる本格的なタスクです。 たとえば、ジョブ マネージャー タスクでは、パラメーターとして指定されたファイルをダウンロードし、ファイルの内容を分析して、その内容に基づいた追加のタスクを送信することができます。
ジョブ マネージャー タスクは、他のすべてのタスクの前に開始されます。 また、以下のような特徴があります。
- ジョブの作成時に、Batch サービスによってタスクとして自動的に送信されます。
- ジョブ内の他のタスクの前に実行するようにスケジュールされています。
- ジョブ マネージャー タスクに関連付けられたノードは、プールが縮小される際、プールから最後に削除されます。
- ジョブ マネージャー タスクの終了を、ジョブ内のすべてのタスクの終了に関連付けることができます。
- ジョブ・マネージャー・タスクは、再始動が必要な場合に、最も高い優先順位として与えられます。 アイドル 状態のノードが使用できない場合、Batch サービスはプール内の他の実行中のタスクの 1 つを終了して、ジョブ マネージャー タスクを実行するスペースを確保する可能性があります。
- あるジョブのジョブ マネージャー タスクは、他のジョブのタスクよりも優先されません。 ジョブ間では、ジョブ レベルの優先順位のみが適用されます。
ジョブ準備タスクおよびジョブ解放タスク
Batch には、ジョブ実行前の設定のためのジョブ準備タスクと、ジョブ後のメンテナンスまたはクリーンアップのジョブ解放タスクが用意されています。
ジョブ準備タスクは、タスクの実行がスケジュールされているすべてのコンピューティング ノードで、他のジョブ タスクの実行前に実行されます。 たとえば、ジョブごとに異なるものの、すべてのタスクによって共有されるデータをコピーするために、ジョブ準備タスクを使用することができます。
ジョブが完了すると、少なくとも 1 つのタスクを実行したプールの各ノードでジョブ解放タスクが実行されます。 たとえば、ジョブ解放タスクでは、ジョブ準備タスクによってコピーされたデータを削除したり、診断ログ データを圧縮してアップロードしたりすることができます。
ジョブ準備タスクとジョブ解放タスクのどちらでも、タスクの呼び出し時に実行するコマンド ラインを指定できます。 これらのタスクは、ファイルのダウンロード、管理者特権での実行、カスタム環境変数、最大実行期間、再試行回数、ファイルのリテンション期間などの機能を備えています。
ジョブ準備タスクとジョブ解放タスクの詳細については、「 Azure Batch コンピューティング ノードでのジョブ準備タスクとジョブ完了タスクの実行」を参照してください。
マルチインスタンス タスク
マルチインスタンス タスク は、複数のコンピューティング ノードで同時に実行するように構成されたタスクです。 複数のコンピューティング ノードをまとめて 1 つのワークロードの処理に割り当てるメッセージ パッシング インターフェイス (MPI) など、ハイ パフォーマンス コンピューティングが要求されるシナリオには、マルチインスタンス タスクを使って対応することができます。
Batch .NET ライブラリを使用して MPI ジョブを Batch で実行する方法の詳細な説明については、「Azure Batch でのマルチインスタンス タスクを使用したメッセージ パッシング インターフェイス (MPI) アプリケーションの実行」を参照してください。
タスクの依存関係
タスクの依存関係は、名前が示すとおり、あるタスクを実行するには、事前にその他のタスクが完了している必要があることを指定できる機能です。 この機能は、"下流" のタスクが "上流" のタスクの出力を使用するような状況や、下流のタスクで必要になる初期化を上流のタスクで実行するような状況に対応できます。
この機能を使用するには、まず Batch ジョブでタスクの依存関係を有効にする必要があります。 その後、別のタスク (または他の複数のタスク) に依存するタスクごとに、どのタスクに依存するかを指定します。
タスクの依存関係がある場合、シナリオを次のように構成できます。
- taskB が taskA に依存する (taskB の実行は taskA が完了するまで開始されない)。
- taskC は taskA と taskB の両方に依存。
- taskD が、実行されるまで特定の範囲のタスク (タスク 1 ~ 10 など) に依存する。
詳細については、Azure Batch におけるタスクの依存関係に関するページと、azure-batch-samples GitHub リポジトリの TaskDependencies コード サンプルをご覧ください。
タスクの環境設定
Batch サービスによって実行されるすべてのタスクは、コンピューティング ノード上に設定されている環境変数を利用することができます。 これには、Batch サービスによって定義された環境変数のほか、ユーザーがタスクに対して定義するカスタム環境変数が含まれます。 これらの環境変数は、タスクによって実行されるアプリケーションやスクリプトから実行中に利用することができます。
カスタム環境変数は、タスクまたはジョブの 環境設定 プロパティを設定することで、タスク レベルまたはジョブ レベルで設定できます。 詳細については、 「タスクをジョブに追加する操作 (Batch REST)、または Azure の BatchTask.EnvironmentSettings プロパティと BatchJob.CommonEnvironmentSettings プロパティを参照してください。Compute.Batch。
クライアント アプリケーションまたはサービスは、タスクに関する情報の取得操作 (Batch REST) を使用するか、BatchTask.EnvironmentSettings プロパティ (Azure) にアクセスすることで、サービス定義とカスタムの両方のタスクの環境変数を取得できます。Compute.Batch)。 コンピューティング ノードで実行されるプロセスは、たとえば %VARIABLE_NAME% (Windows) や $VARIABLE_NAME (Linux) という一般的な構文を使用して、ノード上のこうしたさまざまな環境変数を利用することができます。
サービス定義の環境変数をすべて網羅したリストを、コンピューティング ノードの環境変数に関するページで確認できます。
既知の制限事項
- タスクが実行中の状態でスタックする: Batch サービスはコンピューティング ノードと連携してタスクのライフサイクルを管理します。 タスクが実行のためにコンピューティング ノードにスケジュールされている場合、コンピューティング ノードはタスクの状態を実行から完了まで更新する必要があります。 コンピューティング ノードが Batch サービスに割り込まれたり、接続が失われたりした場合、Batch サービスが別のコンピューティング ノードで実行するようにスケジュールを変更できるようになるまで、そのタスクは実行中の状態を維持します。 他のコンピューティング ノードがない場合、これらのタスクは永続的に実行状態のままになる可能性があります。 タスクが実行中の状態でスタックしているかどうかを確認するには、タスクにクエリを実行して、関連付けられているノードが使用できないか、プールから削除されているかどうかを確認します。
- ジョブが終了すると、Batch サービスは、アクセス可能なコンピューティング ノードを使用して実行中のタスクのみを終了します。 既存のすべてのアクティブなタスクと、使用できないノードを持つ実行中のタスクは、現在の状態のままです。
- タスクが再度キューに入ると (たとえば、プリエンプトされたノードや、
Requeueオプションを使用したプールのリサイズ操作などの場合)、ジョブのキューの末尾にプッシュされます。 そのため、同じジョブで他のアクティブなタスクが待機しているときに、タスクのスケジュール変更が遅れる可能性があります。
次のステップ
- ファイルとディレクトリについて学習します。