[アップデート]AWS BatchでArrayジョブに対応しました #reinvent

2017.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

AWS BatchがArrayジョブに対応したのでご紹介します。

Arrayジョブとは

Arrayジョブはモンテカルロシミュレーション、パラメトリックスウィープ、または大規模なレンダリングジョブなど大量の並列ジョブ(1000同時実行など)を実行する場合に有効な手法です。 ジョブを実行するときに、1回のAPIで指定した配列サイズ(2〜10,000)に従ってジョブを複数登録することができます。

例えば、配列サイズを1000にしジョブを実行すると、1つのジョブから子ジョブが1000実行されます。子ジョブのジョブIDはexample_job_ID:0のようになります。

また環境変数「AWS_BATCH_JOB_ARRAY_INDEX」にジョブのインデックスがつけられます。アレイを1000にすると、インデックスは0,1,2,3....999となります。 例えばインデックスに従って、アプリで使う情報をDBに格納し、ジョブ毎に違う処理を実行することもできます。Arrayジョブで実行される子ジョブは、実行パラメータ(CPU、メモリ、コマンド)は基本的に同じものが指定されて実行されるので、処理を変更したい場合はインデックス番号を利用する必要がありそうです。

Arrayジョブの依存関係

Arrayジョブ実行時の依存関係は2種類指定できます。SEQUENTIAL、N_TO_Nです。

SEQUENTIAL

SEQUENTIALの場合は、順番にジョブを実行していきます。例えばArrayを10にした場合、0が終了したあとに必ず1が実行されます。0が終了する前に1が起動することはないです。

AWS_BATCH_JOB_ARRAY_INDEX=0

N_TO_N

N_TO_Nではジョブの依存関係を指定できます。

例えば、ジョブA(Array4)、ジョブB(Array4)があり、ジョブAが成功している場合にBを実行という指定ができます。

  1. ジョブA:0が成功 > ジョブB:0を実行
  2. ジョブA:1が成功 > ジョブB:1を実行
  3. ジョブA:2が成功 > ジョブB:2を実行
  4. ジョブA:3が成功 > ジョブB:3を実行

のように実行されます。ジョブAをキャンセルするとジョブBもキャンセルされます。また子ジョブが失敗した場合は親ジョブも失敗になります。

やってみた

SEQUENTIAL

ジョブサブミット時に以下で実行してみます。

  • ジョブタイプ:Array
  • Arrayサイズ:3
  • Command:env

ログを確認すると以下になっていました。

  • 子ジョブ1:AWS_BATCH_JOB_ARRAY_INDEX=0
  • 子ジョブ2:AWS_BATCH_JOB_ARRAY_INDEX=1
  • 子ジョブ3:AWS_BATCH_JOB_ARRAY_INDEX=2

1ジョブの中で3回実行され、インデックス番号順に実行されたのが確認できました。

N_TO_N

ジョブAが成功時:ジョブBの依存として成功したジョブAのジョブIDを指定します。

ジョブBは成功でした!

ジョブAが失敗時:ジョブBの依存として失敗したジョブAのジョブIDを指定します。

ジョブBも失敗しました!

最後に

複数ジョブを実行するときの柔軟性が向上しました。また、依存がある場合でも前提ジョブの実行の成功失敗を確認してから実行できるので処理の無駄を減らすことができます。 さらに使いやすくなりました。

参考

https://aws.amazon.com/jp/about-aws/whats-new/2017/11/aws-batch-adds-support-for-large-scale-job-submissions/