Create: 2014/09/14
LastUpdate: 2014/09/15
JobChain に定義したジョブは、通常、シーケンシャルに実行されますが、下図のJITL(JobScheduler Integrated Template Library) の JobChainSplitter を使用すると、ジョブを並列に実行することができます。
JobSchedulerのバージョンは 1.7 です。
ここでは、「JobScheduler FAQ - Parallel Execution in a job chain」を参考にしながら、JobChainSplitter でジョブを並列実行する JobChain を作ってみます。
検証用に作成する JobChain の名称は job_chain1 とし、下図の state を定義します。
job_chain1 を実行すると、JobChainStart から矢印の方向に順番にジョブ流れ、job01_a と job01_b を並列実行します。
ジョブを並列実行する部分は以下のように処理します。
- split_job1(JobChainSplitter) が、job01_a と job01_b を並列実行する。
- sync_job1 で、job01_a と job02_b が終了するまでサスペンドする。
- job01_a と job02_b が終了したら、sync_job1 のサスペンドが解除されて、job02 以降が実行される。
この job_chain1 をテストするために作成したファイルは、以下のとおりです。
JobChainState、split_job1、JobChainEnd は JITLのジョブ を使用します。
- job_chain1.job_chain.xml ・・・ ジョブチェーン
- job_chain1.config.xml ・・・ job_chain1 用の設定
- job01.job.xml ・・・ ジョブ
- job01a.job.xml ・・・ ジョブ
- job01b.job.xml ・・・ ジョブ
- job02.job.xml ・・・ ジョブ
- sync_job1.job.xml ・・・ 同期ジョブ
JobChain の作成
job_chain1.job_chain.xml は以下のようにし、上図の state を定義します。
<?xml version="1.0" encoding="ISO-8859-1"?> <job_chain title="JOB_CHAIN01"> <job_chain_node state="JobChainStart" job="/sos/jitl/JobChainStart" next_state="job01" error_state="!error"/> <job_chain_node state="job01" job="job01" next_state="split_job1" error_state="!error"/> <job_chain_node state="split_job1" job="/sos/jitl/JobChainSplitter" next_state="sync_job1" error_state="!error"/> <job_chain_node state="split_job1:job01a" job="job01a" next_state="sync_job1" error_state="!error"/> <job_chain_node state="split_job1:job01b" job="job01b" next_state="sync_job1" error_state="!error"/> <job_chain_node state="sync_job1" job="sync_job1" next_state="job02" error_state="!error"/> <job_chain_node state="job02" job="job02" next_state="JobChainEnd" error_state="!error"/> <job_chain_node state="JobChainEnd" job="/sos/jitl/JobChainEnd" next_state="FINISH" error_state="!error"/> <job_chain_node state="FINISH"/> <job_chain_node state="!error"/> </job_chain>
青字が、JITL を定義している行です。JobChainStart は、ジョブチェーンの先頭で実行し、JobChainEnd は、最後に実行します。
JobChainSplitter は、ジョブを並列実行します。並列実行するジョブは、JobChainSplitterのパラメータで指定します。(job_chain1.config.xml参照)
赤字は、並列実行するジョブです。 stateの設定値は、"JobChainSplitterのstate:ジョブ名" にします。
JobChain設定ファイルの作成
job_chain1.config.xml は、以下のようにし、JobChainSplitter のパラメータを設定します。
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="scheduler_configuration_documentation.xsl"?> <settings> <job_chain name="job_chain1"> <order> <params/> <process state="split_job1"> <params> <param name="state_names" value="split_job1:job01a;split_job1:job01b"/> </params> </process> </order> </job_chain> </settings>
赤字には、JobChainSplitter のパラメータを定義します。並列実行するジョブの state をセミコロンで区切って定義します。
ジョブの作成
テスト用のジョブ(job01.job.xml、job01a.job.xml、job01b.job.xml、job02.job.xml)を以下のように定義します。
JOCでJobChainの状態を確認しやすいように、10秒間スリープします。
<?xml version="1.0" encoding="ISO-8859-1"?> <job order="yes"> <script language="shell"> <![CDATA[ echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID" echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`" echo "Current Hostname: `uname -n`" echo "Current Username: `whoami`" sleep 10 exit 0 ]]> </script> <run_time /> </job>
同期ジョブの作成
sync_job1.job.xml を以下のようにします。
<?xml version="1.0" encoding="ISO-8859-1"?> <job order="yes" stop_on_error="no" tasks="1"> <params /> <script language="java" java_class="com.sos.jitl.sync.JobSchedulerSynchronizeJobChainsJSAdapterClass"/> <run_time /> </job>
動作確認
JOCで、job_chain1 を即時実行します。
[Job Chains]タブをクリックして、[job_chain1]を右クリックし、メニューから [Add oeder] を選択します。
下図の画面が表示されたら、[submit]をクリックして、job_chian1 を即時実行します。
job_chain1 が始まり、JobChainStart が実行されたところです。
split_job1 まで実行が終わり、job01aとjob01b が並列実行しているところです。
赤枠は、job01a、job01b が並列実行して状態です。
青枠は、sync_job1 でサスペンドしている状態です。
Order が 3 に増えています。
job01a、job01b が終了して、sync_job1 のサスペンドが解除され、job02 が実行されているところです。
job_chain1 が終了したところです。
History は、赤枠のように表示されます。