タスクスケジューリングでは、2 つの戦略を用いてアプリケーションレベルの速度制限を実装できます。具体的には、指定したキューサイズでフロー制御を有効にする方法と、プリエンプティブ優先度付きキューを設定する方法です。これらの方法により、スケジューリングシステムの安定性を確保し、重要なタスクをタイムリーに実行できます。このトピックでは、アプリケーションレベルのリソースとタスクの優先度スケジューリングを効果的に管理する方法について説明します。
利用シーン
タスクスケジューリングの急激な増加に直面した際、システムは多大な負荷を受ける可能性があります。例えば、多くの日次タスクが同時に開始するようにスケジュールされている場合、同時負荷によってバックエンドサービスが過負荷状態になり、システム障害のリスクが生じます。これを防ぐために、タスクスケジューリングでキューイングメカニズムを使用して、アプリケーション内の同時実行タスク数を制限できます。タスクを段階的にディスパッチすることで、システムリソースを効率的に使用し、安定した運用を維持できます。
操作手順
フロー制御の有効化とキューサイズの設定
-
アプリケーショングループを作成または編集する際、詳細設定セクションで [フローコントロール] スイッチを有効にできます。この機能はデフォルトでは無効になっています。詳細については、「アプリケーショングループの作成」をご参照ください。
スイッチを有効にすると、同時実行タスクインスタンス数 を設定できます。この設定は、アプリケーションで同時に実行できるタスクインスタンスの最大数を定義します。この上限を超えたタスクは破棄されず、キューに入れられて実行を待機します。
-
このアプリケーショングループで 3 つのタスクを作成し、それぞれの [操作] 列にある Run Once をクリックします。
-
左側のナビゲーションウィンドウで、Execution List ページに移動し、[タスクインスタンスリスト] タブを選択します。最初にトリガーされたタスク hello_jobA は実行中であり、hello_jobB と hello_jobC はプールで待機中です。
-
hello_jobA が成功すると、hello_jobB がキューからディスパッチされて実行されます。
この時点で、インスタンスリストにおける hello_jobB のステータスは 実行中 に変わり、hello_jobC は プール にとどまります。
プリエンプティブ優先度付きキューの設定
例えば、YARN は優先度付きキューを使用して、異なる優先度のタスクのリソースを分離します。
YARN ResourceManager の Application Queues パネルには、root、research、default キューの容量使用率が表示されます。root キューの容量は 100.0%、research サブキューは 93.8%、default サブキューは 101.6% で、割り当てられた容量を超えています。これは、リソースがどのように分離され、異なる優先度のタスクがリソースを競合するかを示しています。
以下の手順では、SchedulerX がアプリケーションレベルの速度制限とタスク優先度を組み合わせて、プリエンプティブ優先度付きキューを実装する方法について説明します。
-
タスクには優先度を割り当てることができます。同じアプリケーション内で複数のタスクが同時にスケジュールされた場合、優先度の高いタスクが先にディスパッチされます。
タスク作成時、[基本設定] ステップの [優先度] ドロップダウンリストには、低、中、高、最高 の 4 つのオプションがあります。
-
サンプルアプリケーション dts-all.hxm のフロー制御を有効にし、観測しやすくするために 同時実行タスクインスタンス数 を 1 に設定します。次に、高、中、低の優先度を持つ 3 つのタスクを作成します。各タスクを、中優先度、低優先度、高優先度の順に 1 回ずつトリガーします。
コンソールの [タスク管理] ページにあるタスクリストには、作成された 3 つのタスクが表示されます。[優先度] 列にはそれぞれ 高、中、低 と表示され、各タスクの [操作] 列には [単独実行] ボタンがあります。
-
左側のナビゲーションウィンドウで、Execution List ページに移動し、[タスクインスタンスリスト] タブを選択します。中優先度のタスクがトリガーされると、キューが空であるため即座に実行されます。
このとき、高優先度タスク と 低優先度タスク のステータスは両方とも プール であり、中優先度タスク のステータスは 実行中 です。
-
中優先度のタスクが完了すると、キューに実行スロットが空きます。その後、高優先度のタスクが低優先度のタスクをプリエンプトして実行を開始します。
この時点のタスクリストでは、中優先度タスク のステータスは 成功、高優先度タスク のステータスは 実行中、低優先度タスク は プール にとどまり、スケジューリングを待機しています。
よくある質問
-
すべてのタスクの優先度を「最高」に設定した場合、他のユーザーのタスクより先にスケジュールされることは保証されますか?
いいえ。タスクの優先度はアプリケーションレベルにスコープされます。これは、その特定のアプリケーション内のタスクのスケジューリング順序にのみ影響し、他のアプリケーションには影響しません。
-
毎分実行されるタスクにキューベースのフロー制御を使用できますか?
この機能は、トラフィックが急増するシナリオ向けに設計されています。大量の分単位のスケジュールには推奨されません。キューが無限に増大する可能性があるためです。このような場合は、クライアント側の速度制限を実装するか、クライアントをスケールアップして負荷を処理することを検討してください。