[CentOS6][SOS JobScheduler] JITLを使ってJobChainのジョブを並列実行する


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 を並列実行します。
ジョブを並列実行する部分は以下のように処理します。
  1. split_job1(JobChainSplitter) が、job01_a と job01_b を並列実行する。
  2. sync_job1 で、job01_a と job02_b が終了するまでサスペンドする。
  3. 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 を設定します。
赤字には、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 は、赤枠のように表示されます。