こんにちは!
キャスレーコンサルティングの吉岡です。
現在、BigQueryを使ったデータマートの開発・運用・既存改修をしています。

以前、AIデータ分析基盤の構築に携わっていた際に、業務の中で躓いた、
AWS Batchの処理が「Runnable」で止まってしまう問題の解決方法を解説していきます。

目次

1.現象の再現
 1-1.コンピューティング環境
 1-2.ジョブキュー
 1-3.ジョブ定義
 1-4.ジョブ実行
2.原因
3.解決方法
 3-1.再びジョブ実行
 3-2.(補足)正常に起動していたbatch処理が、突然Runnableで止まってしまった場合

1.現象の再現

AWS Batchの処理が「Runnable」で止まってしまう問題の再現をします。

1-1.コンピューティング環境

バッチを処理するEC2環境を定義します。

【コンピューティング環境のタイプ】 → マネージド型
【コンピューティング環境の名前】 → casley-test-env ※自由
【サービスロール】→ AWSBatchServiceRole (新しいロールの作成でも可)
【インスタンスロール】 → ecsInstanceRole (新しいロールの作成でも可)
【プロビジョニングモデル】 → オンデマンド
【許可されたインスタンスタイプ】 → 今回は、a1.xlargeを使用します。
【最小 vCPU】 → 0 (0の場合:batch処理終了後にインスタンスが自動的にterminatedになります。
          1の場合:batch終了後もインスタンスは残り続けます。)
【必要な vCPU】 → 0 (0にするとbatch処理開始時に自動調整してくれます)
【最大 vCPU】 → 5

 

1-2.ジョブキュー

上記で作成したコンピューティング環境と、優先順位を設定します。
【キュー名】→ casley-test-queue
【優先順位】→ 1
【このキューに接続されているコンピューティング環境】→ casley-test-env(上記で作成したもの)

1-3.ジョブ定義

ジョブとして起動するコンテナイメージ、実行コマンド、環境変数などを指定します。
【ジョブ定義名】→ casley-test-job
【ジョブの試行】 → 1
【コンテナイメージ】 → busybox
【コマンド】 → echo hello casley!
【vCPU】 → 今回は、2を設定します
【メモリ】 → 今回は、9000を設定します

1-4.ジョブ実行

上記で設定したコンピューティング環境とジョブキューとジョブ定義を使用し、ジョブを送信します。
【ジョブ名】→ test
【ジョブ定義】→ casley-test-job(上記で作成したもの)
【ジョブキュー】→ casley-test-queue(上記で作成したもの)
【ジョブタイプ】→ 単一

ジョブ送信後、ジョブ実行画面で、実行中のジョブのステータスが確認出来ます。

ステータスがRunnableで止まってしまう問題が発生しました。
EC2の実行中のインスタンス一覧でも、対象のインスタンスの起動が確認できません。

2.原因

ジョブ登録時に指定するvCPU・メモリ量の設定が不適切な状態でジョブを実行すると、
エラーを出さずに実行ステータスが「Runnable」の状態で止まってしまいます。
AWS Batchでは、vCPU・メモリ量にはインスタンスサイズとして、
以下の有効な組み合わせにする必要があります。
ジョブで設定するvCPU・メモリ量 < 使用するEC2インスタンスのvCPU・メモリ量

今回、コンピューティング環境で指定したインスタンスタイプa1.xlargeは、
vCPU「4」・メモリ量「8GiB」のインスタンスでした。
(EC2のインスタンスタイプは、こちらで確認ができます。)
対して、ジョブで設定したのは、vCPU「2」・メモリ量「9000MiB(約8.8GiB)」でした。
ジョブで指定した値が、有効な組み合わせでなかったことが、Runnableで止まってしまった原因です。

今回の原因はメモリ量の設定誤りでしたが、vCPUの設定誤りでも同じ問題が発生します。
(例えば、vCPU「5」にすると、同様の問題が発生します)

3.解決方法

今回の場合は、指定したインスタンスタイプ(a1.xlarge)に有効な組み合わせである、
メモリ量「8192MiB(8GiB)」以下を設定する必要がありました。

3-1.再びジョブ実行

vCPU「2」・メモリ量「2000MiB(約2GiB)」に設定し、ジョブを実行します。

ジョブ送信後、EC2の実行中のインスタンス一覧でインスタンスが起動していることが確認できました。

暫くすると、ジョブステータスが「Succeeded」となり、
Cloud Watchの実行ログに「hello casley!」と出力されました。

・ジョブ実行画面

・Cloud Watch

2-3.(補足)正常に起動していたbatch処理が、突然Runnableで止まってしまった場合

「さっきまでは正常にSucceededしていたのに、同じ設定のジョブが突然Runnableで止まってしまった!」というケースも稀にあります。
その場合は、リージョンのAZ上の、対象インスタンスの起動できる上限数に
引っかかってしまっているためと考えられます。

対応としては、インスタンスタイプのサイズを変える必要があります。
この変更をしたくない場合は、一定時間待ってから、ジョブを実行しましょう。

以上です。
この記事を読んでくださった皆様の問題が解決出来れば幸いです。
最後までご覧いただき、ありがとうございました!

吉岡 真由
CSVIT事業部 吉岡 真由
2019年新卒入社。新しい分野に、どんどんチャレンジしていきたいです!