Tech Sketch Bucket of Technical Chips by TIS Inc.

オープンソースなジョブ管理ツール SOS JobScheduler を使ってみよう -- ジョブチェーン実行編 --

Pocket

この記事はeXcale Developer's Blogから移転されたものです。


eXcale 開発チームの冨樫です。

前回SOS JobScheduler で実際にジョブを実行しましたが、今回は複数ジョブを任意の順番に実行させることや、分岐処理が可能なジョブチェーンを使ってみます。また、ジョブが異常終了した場合の処理についても合わせてご紹介致します。


今回ご紹介する内容の題目です

  • ジョブチェーンの概要
  • ジョブ定義の作成
  • ジョブチェーン定義ファイル作成
  • オーダ定義ファイル作成
  • ジョブチェーンの動作確認

ジョブチェーンの概要

※ JobScheduler を実行する環境が整っていない場合は こちら をご参照ください。

ジョブチェーンを使うことで複数ジョブを任意の順番に実行させることが可能です。
必要なファイルは以下の3つで、形式はすべてXMLです。

  • ジョブ定義ファイル
  • ジョブチェーン定義ファイル
  • オーダ定義ファイル

ジョブ定義ファイルはその名の通り、実行したいジョブを定義するファイルで 前回のブログ で作成したものになります。

ジョブチェーン定義ファイルはジョブを実行する順番や分岐等を設定することができます。シンプルな記述なので書きやすいように思います。

オーダ定義ファイルはジョブチェーンを実行するスケジュールを設定するファイルです。ジョブを単体で実行する場合はジョブ定義ファイル自体に run_time 等を設定していましたが、ジョブチェーンを実行する場合はこのオーダ定義ファイルを使用して設定します。

ジョブ定義の作成

まずは、ジョブチェーンで呼び出すジョブ定義ファイルを作成致します。
※ジョブ定義については 前回のブログ でもご紹介しているので、ご参照ください。

ファイル名:<ジョブ名>.job.xml
ファイル作成場所:$SCHEDULER_HOME/config/live/ ($SCHEDULER_HOME:JobSchedulerのインストール先)

ここで注意することとしては、ジョブチェーンから呼び出す場合はオーダ定義を使用するため、 job タグに order="yes" の属性値を設定することです(order 属性が未設定の場合はデフォルトの "no" が使用されます)。また、オーダ定義を使用するため、実行時刻を指定する run_time タグの記載は不要です。

同様に ジョブチェーンで呼び出すジョブを2つ作成しておきます。

以上でジョブ定義ファイルの作成は完了です。

ジョブチェーン定義の作成

それでは、ジョブチェーン定義ファイルを作成していきます。

ジョブチェーン定義ファイルは特に難しいところはなく、ジョブをどのような順序で実行するかを記載するのみです。

ファイル名:<ジョブチェーン名>.job_chain.xml
ファイル作成場所:$SCHEDULER_HOME/config/live/

ファイルの記載方法ですが、job_chain タグの中に job_chain_node タグを実行したいジョブ毎に作成しています。
job_chain_node タグには下記の属性を設定しています。

・state="xxx":ジョブの状態を表します。状態値が xxx の状態になった際に実行されます。
・job="first":実行されるjobの名前(order="yes" で登録しているジョブのみが指定可能です)
・next_state="yyy":ジョブが正常終了した際に設定される状態値
・error_state="error":ジョブが異常終了した際に設定される状態値

このように、ジョブを実行する順番は、job_chain_node の属性値を使用することで設定できます。

上記サンプルで使用している以外の属性も多数用意されています。詳細については以下をご参照ください。
・job_chain: http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain.xml
・job_chain_node: http://www.sos-berlin.com/doc/en/scheduler.doc/xml/job_chain_node.xml

(補足)
ジョブが異常終了した場合は、その時点で該当ジョブが止まってしまいます。このため、error_state="error" のように設定していても state="error" のジョブは実行されません。異常終了時に該当ジョブを止めずに、state="error" で設定したジョブを実行させたい場合は、該当ジョブの job タグに属性値 stop_on_error="no" を設定しておく必要があります。

オーダ定義の作成

オーダ定義ファイルを作成して、ジョブチェーンを何時実行するかを設定します。

ファイル名:<ジョブチェーン名>,<オーダID>.order.xml
ファイル作成場所:$SCHEDULER_HOME/config/live/
※ オーダIDは任意の値(英数字)を指定してください。
※ ファイル名の<ジョブチェーン名>と<オーダID>の間はカンマ "," なので気をつけてください!

order タグの中に run_time タグで実行したい時刻を設定しています。
order タグには job_chain 属性でこのオーダ定義を適用するジョブチェーン名を設定しています。

また、run_time タグ内の period タグに repeat 属性を設定することで、対象のジョブチェーンを10秒毎に実行する設定になっています。

上記サンプルで使用している以外の属性も多数用意されています。詳細については以下をご参照ください。
・order: http://www.sos-berlin.com/doc/en/scheduler.doc/xml/answer/order.xml
・run_time: http://www.sos-berlin.com/doc/en/scheduler.doc/xml/run_time.xml

これで、ジョブチェーンの設定は完了です。
実際に動作を JOC(JobScheduler Operating Center) で確認してみましょう。

ジョブチェーンの動作確認

JOC の画面を開き、動作を確認してみましょう
※ JobScheduler は "$SCHEDULER_HOME/config/live/" 配下に置かれた各定義ファイルを動的に取り込んでくれるため、定義ファイルの登録作業等は不要です。

http://サーバアドレス:4444/

まずは、Jobs タブに作成した3つのジョブが登録されていることを確認します。

次に、Job Chains タブより、作成したジョブチェーンが登録されていることを確認します。

最後に Orders タブより、作成したオーダが登録されていることを確認します。

登録されていることが確認できたら、実際にジョブが実行されているかをログファイルより確認します。

※ 登録が反映されていない場合は画面右上の update ボタンをクリックしてください。

Jobs タグより対象のジョブ(first, second, last)を選択し、画面右側の Task History よりジョブを実行した際のログを確認することができます。

first、second、last の各ジョブがそれぞれ以下のように、正常に出力されていることが確認できれば、ジョブチェーンの実行は成功です!

では次にジョブが異常終了した場合のケースも確認してみましょう。

ジョブが異常終了した場合は、その時点で該当ジョブが止まり、以降、オーダ定義で設定した時刻になっても処理が実行されなくなります(※)。試しに second ジョブが異常終了(exit 1)するように以下のようにジョブ定義ファイルを修正してみましょう。

※ 該当ジョブ定義の job タグに stop_on_error="no" の属性値を設定すると、異常終了しても該当ジョブが止まらなくなります。オーダ定義で設定した時刻になれば再度ジョブチェーンの先頭ジョブから実行されます。

修正が完了したら、修正が JobScheduler に取り込まれているかを確認します。
second ジョブを右クリックし、Show configration を選択してください

second ジョブの内容が表示されるので、修正内容が反映されていることを確認してください。
※ 修正内容が反映されていない場合は画面右上の update ボタンをクリックしてください。

修正内容反映後の実行結果を JOC より確認してみましょう。second ジョブが stopped となっていることが確認できるかと思います。これ以降はオーダ定義で設定した時刻になってもジョブチェーンは実行されません。

このままでは、該当ジョブが止まったままになってしまうので、復帰させましょう。
まず、second.job.xml を元に戻してください。その後、secondジョブを右クリックし、Unstop job を選択してください。

再度 second ジョブが実行され、正常終了することが確認できます。


最後に

今回は SOS JobScheduler のジョブチェーン機能を使ってみました。単純な記載のみなので、新たにジョブやジョブチェーンを追加する際も手間がかからなく助かっています。JobScheduler はオープンソースでかつ、機能が豊富なジョブ管理ツールなので、ジョブ管理ツールを検討中であれば是非使ってみてください。

エンジニア採用中!私たちと一緒に働いてみませんか?