アクティブ化フィルターと送信フィルターについて
このトピックでは、管理者がクラスターに追加できるカスタム ジョブ フィルターの種類と、HPC ジョブ スケジューラ サービスがこれらのフィルターからの戻り値に基づいてジョブを処理する方法の概要について説明します。
ジョブの送信フィルターとジョブアクティブ化フィルターは、クラスター上のジョブの追加のチェックと制御を提供するカスタム アプリケーションです。 たとえば、送信フィルターでは、選択した情報に対してジョブ のプロパティを確認したり、ジョブ プロパティの値を変更したりできます。 アクティブ化フィルターでは、リソースがジョブに割り当てられる前に、ライセンスの可用性などの要因を確認できます。 フィルターからの戻り値に応じて、HPC ジョブ スケジューラ サービスはジョブに対して適切なアクションを実行します。 適用するスケジュール ポリシーにカスタム フィルターが必要かどうかを判断するには、「Windows HPC Serverでジョブ送信フィルターまたはジョブ アクティブ化フィルターを使用するタイミング」を参照してください。
このトピックでは、アクティブ化フィルターと送信フィルター、およびフィルターからの戻り値が HPC ジョブ スケジューラ サービスによってどのように解釈されるかについて説明します。 フィルターのインストールと構成の詳細については、「Microsoft HPC Packでのサブミッション フィルターとアクティブ化フィルターのインストール」を参照してください。
このトピックでは、次の操作を行います。
クラスター全体およびジョブ テンプレート固有のフィルター を
する
カスタム フィルターを実行する場合
HPC ジョブ スケジューラ サービスは、ジョブがクラスターに送信されたとき (送信フィルター) またはジョブがクラスター リソース (アクティブ化フィルター) を取得しようとしているときに、カスタム フィルターを実行できます。
送信フィルターは、ジョブがジョブ テンプレートに対してチェックされる前に、ジョブが送信されるとすぐに実行されます (送信フィルターは、割り当てられたジョブ テンプレートを含むジョブのプロパティを変更できます)。 ジョブが送信フィルターに合格すると、ユーザー資格情報が検証され、ジョブ テンプレートの既定値と値の制約が適用されます。 詳細については、「アクティブ化フィルターと申請フィルターについて [ヘルプ リンク?] 」を参照してください。
アクティブ化フィルターは、候補リソースがキューまたは実行中のジョブに割り当てられるときに実行されます (ジョブの候補リソースは、ジョブとタスクのプロパティとスケジュール ポリシーに基づいています)。 アクティブ化フィルターは、それらのリソースでジョブを開始する必要があるかどうか、またはジョブに対してリソースを保持するか解放するかを決定できます。 アクティブ化フィルターは、リソースがジョブに割り当てられるたびに実行されるため、アクティブ化フィルターは同じジョブに対して複数回実行される可能性があります。 たとえば、アクティブ化フィルターは、ジョブが開始されようとしているときに実行し、新しいリソースがジョブに追加されようとしているときに再度実行できます (動的拡張)。
クラスター全体およびジョブ テンプレート固有のフィルター
カスタム フィルターはクラスター全体のレベルで定義でき、すべてのジョブで実行されます。 クラスター全体のフィルターは、実行可能アプリケーションまたはスクリプトとして実装されます。 HPC Pack 2008 R2 の Service Pack 2 以降では、カスタム フィルターをジョブ テンプレート レベルで定義することもできます。 これらのフィルターは、関連付けられているジョブ テンプレートで送信されたジョブでのみ実行されます。 テンプレート レベルのフィルターを使用すると、特定の種類のジョブに対して特定のフィルターを実行したり、必要に応じて一連のフィルターを実行したりできます。
手記
ジョブ テンプレート レベルのフィルターは DLL として定義し、IActivationFilter
または ISubmissionFilter
インターフェイスを実装する必要があります。
クラスター全体のフィルターとジョブ テンプレート レベルのフィルターの両方をクラスターに追加できます。 ジョブが送信されるか、アクティブ化の準備ができたら、クラスター全体のフィルターの前にジョブ テンプレート フィルターが実行されます。
ジョブ送信フィルターとその戻り値
HPC ジョブ スケジューラ サービスは、ジョブが送信されるたびにジョブ送信フィルターを実行できます。 このフィルターでは、ジョブのプロパティを確認して、ジョブをキューに追加する必要があるかどうかを判断できます。
送信フィルターは、ジョブ記述 XML (ジョブの用語を指定) を解析して、許可または制限するオプション、または必要なオプションを含めなかったかどうかを確認します。 送信フィルターでは、ジョブ XML ファイルを変更することで、ジョブ のプロパティ値を変更することもできます。 タスク プロパティの値は変更できません。
HPC ジョブ スケジューラ サービスは、ジョブ送信フィルターからの戻り値に基づいて、次の表に示すようにジョブを処理します。
終了コード | ジョブ スケジューラ アクション |
---|---|
0 | ジョブがキュー as-isに追加されます。 |
1 | フィルターによって 1 つ以上のジョブ プロパティが変更され、ジョブがキューに追加されます。 |
その他の終了コード | ジョブは 失敗 としてマークされ、送信フィルターがジョブに失敗したことを示すエラー メッセージが表示されます。 |
フィルターのタイムアウト | ジョブは 失敗した としてマークされ、送信フィルターがタイムアウトしたことを示すエラー メッセージが表示されます。 既定のタイムアウトは 15 秒です。 この設定は、[ジョブ スケジューラの構成] ダイアログ ボックスで変更できます。 |
フィルターが見つかりません | ジョブは 失敗した としてマークされ、フィルターが見つからなかったというエラー メッセージが表示されます。 |
手記
送信フィルターのチェーンを指定した場合、ジョブは、すべてのフィルターを正常に通過するまで、一覧表示された順序で各フィルターを実行します。 終了コードが 0 の場合、ジョブは次のフィルターに渡されます。 終了コードが 1 の場合、変更されたジョブは次のフィルターに渡されます。 ジョブがチェーン内の任意の時点で失敗した場合、必要に応じてフィルターがアクションを元に戻せるように、ジョブで既に実行されているすべての送信フィルターが逆に再度呼び出されます。
ジョブアクティブ化フィルターとその戻り値
HPC ジョブ スケジューラ サービスは、候補リソースがキューに登録されているジョブまたは実行中のジョブに割り当てられるときに、アクティブ化フィルターを実行できます。 ジョブのアクティブ化フィルターは、ライセンスの使用不能や送信ユーザーの使用時間の超過など、アクティブ化された場合にジョブが失敗する原因となる要因をジョブで確認できます。
アクティブ化フィルターは、ジョブ記述 XML (ジョブの用語を指定) を解析し、ジョブのプロパティとその他のデータ ソースを調べて、ジョブがリソースを使用できるかどうかを判断できます。 追加のパラメーターがフィルターに渡され、現在のスケジュール パス中に使用可能な候補リソースの数、キュー内のジョブの位置、クラスターでバックフィルが有効になっているかどうかなどの情報が提供されます。 これらのパラメーター IActivationFilter
インターフェイスの public ActivationFilterResponse FilterActivation(Stream jobXml, int schedulerPass, int jobIndex, bool backfill, int resourceCount)
を確認してください。 フィルターを作成する開発者は、これらのパラメーターを使用してフィルターの動作を微調整できます。
アクティブ化フィルターからのフィルター戻り値に基づいて、HPC ジョブ スケジューラ サービスはジョブを開始し、ジョブが開始できるようになるまでキューをブロックし、キューをブロックせずにジョブのリソースを予約するか、ジョブを保留にします。 特定のジョブを保持する時間は、Hold Until ジョブ プロパティを使用して設定できます。 ジョブが保留状態で、そのジョブに 値が指定されるまで
大事な
ジョブが実行されると、Hold Until プロパティがクリアされます。
手記
アクティブ化フィルターとバックフィル: ジョブは、アクティブ化フィルターの戻り値が 0 のバックフィル ウィンドウでのみ実行できます。
HPC ジョブ スケジューラ サービスは、ジョブのアクティブ化フィルターからの戻り値 (終了コード) に基づいて、次の表に示すようにジョブを処理します。
終了コード | キューに入ったジョブ | 実行中のジョブ |
---|---|---|
0 | ジョブを開始します。 ジョブは候補リソースで開始されます。 |
ジョブを拡大します。 候補リソースが実行中のジョブに追加されます。 |
1 | ジョブを開始せず、キューをブロックします。 ジョブは開始されず、キューに残ります。 ジョブが成功するか取り消されるまで、他のジョブまたは同等以下の優先順位は開始されません。 フィルターは、ジョブが成功するまで、またはジョブが取り消されるまで、ジョブを定期的に再評価します。 |
ジョブを拡大しないでください。 候補リソースは、実行中のジョブに追加されません。 キューはブロックされず、リソースを他のジョブに使用できます。 |
2 | ジョブを開始したり、リソースを保持したり、他のジョブのスケジュールを続行したりしないでください。 ジョブは開始されませんが、スケジュール モードに応じて候補リソースが予約されます。キューに入っている場合は、ジョブの最大リソースまで予約されます。では、最小リソースが予約されます。 他のリソースで他のジョブを開始できます。 フィルターは、ジョブが成功するまで定期的にジョブを再評価します。 |
未定義。 このフィルターは、実行中のジョブに対してこの終了コードを返すべきではありません。 |
3 | ジョブを保持し、リソースを解放し、他のジョブのスケジュールを続行します。 ジョブは、Hold Until ジョブ プロパティで指定された日時まで保留。 保留期間の後、ジョブはフィルター・プログラムによって再評価されます。 フィルターが終了コード 3 で戻り、そのジョブに 値が指定されるまでの |
未定義。 このフィルターは、実行中のジョブに対してこの終了コードを返すべきではありません。 |
4 | ジョブを失敗します。 ジョブは 失敗した としてマークされ、アクティブ化フィルターによってジョブが失敗したことを示すエラー メッセージが表示されます。 |
未定義。 このフィルターは、実行中のジョブに対してこの終了コードを返すべきではありません。 |
その他の終了コード | 未定義。 ただし、値 2 と同じように扱われます。 | 未定義。 このフィルターは、実行中のジョブに対してこの終了コードを返すべきではありません。 |
フィルターのタイムアウト | 終了コード 2 と同じです。 既定のタイムアウトは 15 秒です。 この設定は、[ジョブ スケジューラの構成] ダイアログ ボックスで変更できます。 |
未定義。 |
フィルターが見つかりません | 終了コード 2 と同じです。 | 未定義。 |
手記
アクティブ化フィルターのチェーンを指定した場合、終了コードが 0 である限り、ジョブは一覧表示された順序で各フィルターによって評価されます。 フィルターから 0 以外の終了コードが返された場合、その値は HPC ジョブ スケジューラに渡され、ジョブで既に実行されているアクティブ化フィルターは、必要に応じてフィルターがアクションを元に戻せるように逆に再度呼び出されます。 たとえば、使用可能なライセンスをチェックするアクティブ化フィルターには、revert 関数が呼び出された場合にライセンスを解放するコードが含まれる場合があります。
その他の参照
送信フィルターとアクティブ化フィルター Cluster-Wide 追加または削除する方法
HPC ジョブ スケジューラ サービス の構成
ジョブ キュー の管理の