AWS Batchのジョブキューとジョブスケジューリングを整理した

# 背景・目的
以前、下記の記事で、AWS Batchの基本的な情報とコンピューティング環境について整理しました。

https://qiita.com/zumax/items/f9b27b5e69cba66c9a81

https://qiita.com/zumax/items/4d426da81e38e7f8a040

今回は、ジョブキューについて整理します。

# まとめ
下記に特徴を整理します。

|特徴|説明|
|:--|:--|
| ジョブキューの役割|ジョブは、ジョブキューに送信され、コンピューティング環境で実行するようスケジュールされるまで保存される<BR><BR>ジョブは、ジョブキューに送信され、コンピューティング環境で実行するようスケジュールされるまで保存される<BR><BR>ジョブキューには優先度がある。スケジューラーはこれを使用して、どのキューのどのジョブを最初に実行すべきか判断する|
|ジョブキューパラメータ|下記の４つの基本コンポーネントに分かれる<BR>・name<BR>・state<BR>・priority<BR>・compute environment order|
|ジョブスケジューリング|AWS Batchスケジューラーは、ジョブキューに送信されたジョブをいつ、どこで、どのように実行するかを評価する|

# 概要
下記を基に整理します。

https://docs.aws.amazon.com/batch/latest/userguide/job_queues.html

> ジョブはジョブキューに送信され、コンピューティング環境で実行するようにスケジュールされるまでそこに保存されます。AWS アカウントには複数のジョブキューを設定できます。たとえば、優先度の高いジョブに Amazon EC2 オンデマンドインスタンスを使用するキューを作成し、優先度の低いジョブに Amazon EC2 スポットインスタンスを使用する別のキューを作成できます。ジョブキューには優先度があり、スケジューラはこれを使用して、どのキューのどのジョブを最初に実行すべきかを判断します。

- ジョブは、ジョブキューに送信され、コンピューティング環境で実行するようスケジュールされるまで保存される
- AWS アカウントには複数のジョブキューを設定できる
    - 例
        - 優先度の高いジョブに Amazon EC2 オンデマンドインスタンスを使用するキューを作成する
        - 優先度の低いジョブに Amazon EC2 スポットインスタンスを使用する別のキューを作成する
- ジョブキューには優先度がある。スケジューラーはこれを使用して、どのキューのどのジョブを最初に実行すべきか判断する

## ジョブキューパラメータ
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/job_queue_parameters.html

> ジョブ キューは、名前、状態、優先度、コンピューティング環境の順序という 4 つの基本コンポーネントに分かれています。

- ジョブキューは下記の４つの基本コンポーネントに分かれる
    - name
    - state
    - priority
    - compute environment order
### Job queue name
- ジョブキューの名前

### Job queue state time limit actions
- 指定された状態で指定された時間以上ジブキューの先頭に残っているジョブに対して AWS Batch が実行する一連のアクション
- AWS Batch は、maxTimeSeconds が経過した後に各アクションを実行する
- maxTimeSeconds の最小値は 600 (10 分)、最大値は 86,400 (24 時間) 

### Priority
- ジョブキューの優先度
- 同じコンピューティング環境に関連付けられている場合、より高い優先順位 (または優先順位パラメーターのより高い整数値) を持つジョブ キューが最初に評価される
- 優先順位は降順に決定される
    - 例
        - 優先順位値 10 のジョブ キューには、優先順位値 1 のジョブ キューよりも優先されたスケジュール設定が与えられる

### Scheduling policy
- ジョブキューのスケジュールポリシーの Amazon リソースネーム (ARN)
- スケジュール ポリシーを持たないジョブ キューは、先入れ先出し (FIFO) モデルでスケジュールされる
- ジョブ キューにスケジュール ポリシーが設定されると、ジョブ キューを置き換えることはできるが、削除することはできない
- スケジュール ポリシーのないジョブ キューは FIFO ジョブ キューとしてスケジュールされるため、スケジュール ポリシーを追加することはできない
- スケジューリング ポリシーを持つジョブ キューには、最大 500 個のアクティブなフェア シェア ID を含めることができる
    - 制限に達すると、新しいフェアシェア識別子を追加するジョブの送信は失敗する

### State
- ジョブキューの状態
- ジョブ キューの状態が ENABLED (デフォルト値) の場合、ジョブを受け入れることができる
- ジョブ キューの状態が DISABLED の場合、新しいジョブをキューに追加することはできないが、すでにキューにあるジョブは終了できる

### Compute environment order
- ジョブ キューにマップされた一連のコンピューティング環境と、それらの相互の順序
- ジョブ スケジューラはこのパラメータを使用して、どのコンピューティング環境で特定のジョブを実行するかを決定する
- コンピューティング環境をジョブ キューに関連付ける前に、コンピューティング環境を VALID 状態にする必要がある
- 最大 3 つのコンピューティング環境をジョブ キューに関連付けることができる
- すべてのコンピューティング環境は、Amazon EC2 (EC2 または SPOT) または Fargate (FARGATE または FARGATE_SPOT) である必要がある
-  EC2 と Fargate のコンピューティング環境を混合することはできない


## ジョブキューのステータスの表示
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/job_queue_viewing_status.html

ジョブキューを作成してジョブを送信すると、その進行状況をモニタリングできることが重要です。ジョブの詳細ページを使用して、ジョブキューを確認、管理、モニタリングできます。

### ジョブキュー情報の表示

> AWS Batch コンソールから、ナビゲーションペインでジョブキューを選択し、目的のジョブキューを選択して詳細を表示します。このページでは、ジョブキューを確認して管理し、ジョブキューのスナップショット、ジョブの状態制限、環境の順序、タグ、ジョブキューの JSON コードなど、キューのオペレーションに関する追加情報を確認できます。

- コンソールから詳細を表示できる
- ジョブキューを確認して下記が確認できる
    - ジョブキューのスナップショット
    - ジョブの状態制限
    - 環境の順序
    - タグ
    - ジョブキューの JSON コードなど

#### ジョブキュースナップショット
> このセクションでは、キューに入っている最初の 100 個のRUNNABLEジョブの静的リストを示します。検索フィールドを使用して、結果セクションの任意の列から情報を検索することでリストを絞り込むことができます。スナップショット結果エリアのジョブは、ジョブキューの実行戦略に従ってソートされます。 first-in-first-out (FIFO) ジョブキューの場合、ジョブの順序は送信時間に基づきます。AWS Batch 公平配分スケジューリング (FSS) ジョブキューの場合、ジョブの順序はジョブの優先度と共有使用状況に基づきます。

- キューに入っている最初の 100 個のRUNNABLEジョブの静的リストを表示する
- ジョブキューの実行戦略に従ってソートされる
    - first-in-first-out (FIFO) ジョブキューの場合、ジョブの順序は送信時間に基づく
    - AWS Batch 公平配分スケジューリング (FSS) ジョブキューの場合、ジョブの順序はジョブの優先度と共有使用状況に基づく

- 結果はジョブキューのスナップショットであるため、結果リストは自動的に更新されない。手動で更新する

#### 環境の順序
- ジョブキューが複数の環境で実行されている場合、このタブにはその順序と概要が表示される

## ジョブスケジューリング
下記を基に整理します。

https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/job_scheduling.html

> AWS Batch ケジューラは、ジョブキューに送信されたジョブをいつ、どこで、どのように実行するかを評価します。ジョブキューの作成時にスケジューリングポリシーを指定しない場合、 AWS Batch ジョブスケジューラはデフォルトで先入れ先出し (FIFO) 戦略になります。FIFO 戦略では、重要なジョブが以前に送信されたジョブの後ろでスタックする可能性があります。別のスケジューリングポリシーを指定することで、特定のニーズに応じてコンピューティングリソースを割り当てることができます。

- AWS Batchスケジューラーは、ジョブキューに送信されたジョブをいつ、どこで、どのように実行するかを評価する
- ジョブキューの作成時にスケジューリングポリシーを指定しない場合、 AWS Batch ジョブスケジューラはデフォルトで先入れ先出し (FIFO) 戦略になる
    - FIFO 戦略では、重要なジョブが以前に送信されたジョブの後ろでスタックする可能性がある
- 別のスケジューリングポリシーを指定することで、特定のニーズに応じてコンピューティングリソースを割り当てることが可能

### Share identifiers
- Share identifiersをつけることで、ユーザーとワークロードを区別する
- AWS Batch スケジューラは、(T * weightFactor)式を使用して、Share identifiers の使用状況をトラッキングする
    - Tは時間の経過に伴うvCPU使用状況
    - スケジューラーは、Share identifiersから使用率が最も低いジョブを選択する
- Share identifiersは、ジョブキュー内で一意であり、ジョブキュー全体で集計されることはない
- スケジュールの優先順位を設定して、Share identifiers でのジョブの実行順序を設定できる
- スケジュール優先度の高いジョブが最初にスケジュールされる
- スケジュールポリシーを指定しない場合、ジョブキュー送信されるすべてのジョブはFIFO順になる

### Fair share scheduling
- フェア シェア スケジューリングは、ジョブのスケジュールを支援するための一連の制御を提供する

#### Share decay seconds
- AWS Batch スケジューラが各フェアシェア ID のフェアシェアの割合を計算するために使用する期間 (秒単位)
- 値 0 は、現在の使用量のみが測定されることを示す。減衰時間が長いほど、時間の重みが大きくなる
- 減衰期間は次のように計算される
- shareDecaySeconds + OrderMinutes ここで、OrderMinutes は分単位の注文時間

#### Compute reservation
- 単一の共有識別子のジョブがジョブ キューに接続されているすべてのリソースを使い切ることを防ぐ
- 予約率は computeReservation/100)^ActiveFairShares で計算される
- ActiveFairShares はアクティブなフェア シェア識別子の数
- 共有識別子に SUBMITTED、PENDING、RUNNABLE、STARTING、または RUNNING 状態のジョブがある場合、その共有識別子はアクティブな共有識別子とみなされる
- 減衰期間が経過すると、共有識別子は非アクティブとみなされる

#### Weight factor
- 共有識別子の重み係数
- デフォルト値は 1
- 値を小さくすると、共有識別子からのジョブが実行されるか、共有識別子に追加のランタイムが与えられる
- たとえば、重み係数 0.125 (1/8) の共有識別子を使用するジョブには、重み係数 1 の共有識別子を使用するジョブの 8 倍のコンピューティング リソースが割り当てられる
- この属性を定義する必要があるのは、デフォルトの重み係数 1 を更新する必要がある場合のみ

# 考察
今回、ジョブキューとスケジューリングについて整理してみました。
スケジューリングについて、実感がわかないので、今後は手を動かして試してみます。

# 参考

https://qiita.com/zumax/items/f9b27b5e69cba66c9a81

https://qiita.com/zumax/items/4d426da81e38e7f8a040

https://data-engineer-tech.com/aws-batch-step-functions-batch-simple/

https://docs.aws.amazon.com/batch/latest/userguide/job_queues.html

https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/job_queue_parameters.html

https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/job_queue_viewing_status.html