次は、excuteジョブから実行するParallelExecution Job Chainを作成します。
まず、JOEのFileメニューから[New]→[HotFolderObject]→[JobChain]を選択します。
Chain Nameに「ParallelExecution」と入力し、左側のメニューから「Steps/Nodes」を選択します。
ここでは、「p1→sync」「p2→sync」「p3→sync」という3通りの実行フローを作成するため、「p1」「p2」「p3」「sync」「success」「error」という6個のNode(Job)を定義します。
「New Chain Node」をクリックし、Stateに「p1」、jobに実行するジョブ名、Next Stateに「sync」、Error stateに「error」と入力し、Apply Chain Nodeをクリックします。同様に、残りのNodeも追加していきます。
ただし、SuccessとErrorだけは「Full Node」ではなく「End Node」とします。
保存されたXMLファイルを開くと下記の内容になっています。
<?xml version="1.0" encoding="ISO-8859-1"?> <job_chain orders_recoverable="yes" visible="yes" name="ParallelExecution"> <job_chain_node state="p1" job="ParallelJob1" next_state="sync" error_state="error"/> <job_chain_node state="p2" job="ParallelJob2" next_state="sync" error_state="error"/> <job_chain_node state="p3" job="Paralleljob3" next_state="sync" error_state="error"/> <job_chain_node state="sync" job="Sync" next_state="success" error_state="error"/> <job_chain_node state="success"/> <job_chain_node state="error"/> </job_chain>
ここまで来たら、あと少しです。
ジョブ2-3(Paralleljob3)だけを単独実行させるために排他制御の設定を行います。
左側メニューの「Locks」を選択し、「New Lock」をクリックし、Lock名に「only1job」と入力して「Apply Lock」をクリックします。
次に、多重実行するそれぞれのジョブを定義します。今回はサンプルですので、実行後しばらく待機(sleep)するだけのジョブを作成します。
JOEからNew Jobを作成します。
Job Nameは「Paralleljob1」「Paralleljob2」「Paralleljob3」とし、Languageは「shell」、ScriptのExecutableには
echo parallelJob1
sleep 60
と入力します。echoさせるのはそれぞれのジョブ名です。sleepは、待ち合わせが機能するかどうかを確認するために、Paralleljob1は「60秒」、Paralleljob2と3は「20秒」に設定します。
左側メニューの「Locks」を選択し、「New Lock Use」をクリック、Lockのプルダウンメニューから、先ほど作成した「only1job」を選択します。「Paralleljob1」「2」については、同時実行させるためにExclusiveのチェックを外します。逆に、Paralleljob3だけは単独実行させるために、Exclusiveのチェックを入れます。
保存されたParalleljob3のXMLファイルを開くと、下記の内容になっています。
<?xml version="1.0" encoding="ISO-8859-1"?> <job order="yes" stop_on_error="no" name="ParallelJob3"> <lock.use lock="only1job" exclusive="yes"/> <script language="shell"> <![CDATA[ echo parallelJob3 sleep 20 ]]> </script> <run_time /> </job>
これで準備は完了しました。では早速実行しましょう。
WebブラウザーからJOCを開き、ジョブチェーンタブを選択します。そして、先ほど作成した「ParallelSample」を右クリックし、「オーダー作成」を選択して実行します。
全てのジョブが実行されているように見えますが、ロックタブを選択すると、「Paralleljob1」「Paralleljob2」がロックを保持し、Paralleljob3が待機していることが分かります。
最新履歴タブを選択し、「タスクのみ表示」をクリックすると、Paralleljob1の処理完了後、Paralleljob3が起動されたことを確認できます。
以上、ちょっと複雑なジョブ定義でも、多重実行や排他制御、待ち合わせ制御をうまく利用して組み上げられることがお分かりいただけたと思います。皆さんの環境や運用方法に応じて、いろいろ工夫を凝らしてみてください。
次回は、JobSchedulerに付属する、JOE以外のお役立ちツールを紹介します。
SOS社の並列実行解説記事(英語)
http://www.sos-berlin.com/mediawiki/index.php/Parallel_Execution
Blue21さんの並列実行解説記事(日本語)
http://blue21.ddo.jp/server_koutiku/server-centos6/cos6_sosjob808.html
船井覚
OSSラボ株式会社 代表取締役
日本JobSchedulerユーザーグループ 代表
日本openQRMユーザーグループ 代表
1981年関西学院大学卒業。グループワンソフトウェア、ネットマークス、日本IBM、シークエントコンピューターズジャパン、バロースにおいて、PC、UNIX、SMPハイエンドサーバー、ERP、BI、無線技術、セキュリティ、ネットワークサービス、ソフトウェアと、扱うものは変わってきましたが、最先端の技術を追いかけてきました。現在は、HadoopやAsakusaなどの分散処理フレームワークから、分散仮想ストレージ、openQRMやOpenstackなどのクラウド管理システム、JobSchedulerやPuppet、fabric、ansibleなどの運用自動化基盤を企業向けに提供しています。
Copyright © ITmedia, Inc. All Rights Reserved.