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