AWS Batchの消耗品リソースによるスケジューリングを試してみた
データ事業本部の鈴木です。
2/27に登場したAWS BatchのResource-aware schedulingを試してみました。
マネジメントコンソールに消耗品リソース
という項目が追加されており、なんだろうと思っている方もいるかと思います。
機能については以下のAWSブログが大変分かりやすいですが、自分でも試してみたかったので、検証した内容を記事にしました。合わせて参考になりましたら幸いです。
Resource-aware schedulingについて
サードパーティのライセンストークン・データベースアクセス帯域幅・予算制限などの消耗するリソースによりジョブをスケジュールできる機能です。
事前に消耗品リソースとその量を定義しておき、その量を制限としてジョブ実行がスケジュールされます。
消耗品リソースには以下の2つがあります。
- REPLENISHABLE(デフォルト):使用後、量が元に戻る
- NON_REPLENISHABLE:使用すると量が元に戻らない
REPLENISHABLEはライセンストークンやデータベースアクセス帯域幅、NON_REPLENISHABLEは月次の予算制限などを表現するのに便利と思います。今回はREPLENISHABLEを試してみました。
やってみた
0. 試した環境
オーケストレーションタイプがECS、最大vCPUが4で配分戦略がBest fit progressiveのコンピューティング環境を作成しました。
10秒待機するPythonスクリプトを作成し、コンテナ化してECRレポジトリにPUSHしておきました。ジョブ定義では1vCPU、2048MiBの環境設定としました。ジョブキューをデフォルト設定で作成しておきました。
なお、今回は比較のため事前に作成済みのジョブ定義を使用したジョブで消耗品リソース使用の指定をオーバーライドしましたが、ジョブ定義で設定しておくことも可能です。
1. 消耗品リソースの作成
コンソールより消耗品リソースを作成しました。今回は合計リソース量が1のREPLENISHABLEなリソースを作成しました。
作成したリソースは、使用率やどのジョブが使用したかを確認することができます。
リソースの追加(加算)・設定(上書き)・削除(減算)もできます。NON_REPLENISHABLEなリソースの場合はリソースの利用可能数を変更する際にこのアクションを使うことになりそうです。
2. 消耗品リソースを指定しない場合
まずは使用しない場合のジョブの実行状況を確認しました。
作成済みのジョブ定義から、配列サイズ10の配列ジョブを作成し実行しました。
今回の条件では、3つ単位で並列で子ジョブが実行されました。
今回は合計用が1の消耗品リソースを作成しているため、このリソースを指定したときに、1つずつ子ジョブが実行されるか確認します。
3. 消耗品リソースを指定した場合
ジョブ作成時に消耗品リソースのオーバーライドで以下のように設定し、配列サイズ10の配列ジョブを作成・実行しました。
なお、リクエスト済み値はジョブが使用するリソース量です。
子ジョブの実行結果は以下のようになりました。
確かに一つずつ実行されていることが分かりました。開始時間を見ると、消耗品リソースの解放には若干の時間がかかるようでした。
今回試した条件だと、消耗品リソースの解放を待つ際には、ジョブのステータスがPending
になるようでした。
最後に
AWS Batchの消耗品リソースによるスケジューリングを試してみました。
ライセンス数などのリソースで、使用できる数が決まっているようなケースは結構ある状況と思いますが、今回の消耗品リソースの機能を使うことで独自の作り込みを行わずともAWS Batch側でジョブをスケジュールしてくれるのは非常に便利だと思いました。
こういったユースケースの場合はぜひ活用して頂くと良いと思います。