Upload
oss
View
1.212
Download
1
Embed Size (px)
DESCRIPTION
12/3第4回勉強会の資料です
Citation preview
ジョブの多重実行・排他制御
第4回 JobSchedulerユーザー会2013/12/3
作りたいジョブ
ジョブ1がジョブ2 1〜3を同時起動−ジョブ2 3だけは単独実行させたい−ジョブ2 1〜3全てが完了してから、ジョブ−3を起動する
ジョブ 1ジョブ 2-
1
ジョブ 2-2
ジョブ 2-3
ジョブ 3
JobSchedulerで並列ジョブの作り方
1. Stand Alone Jobジョブ定義のシェルで実行プログラムを複数実行する→エラー制御や排他制御まで書く必要がある→JobScheduler使う意味ないじゃん?
2. Job Chain Job Chainの Order Jobを同時に実行する
→Order Jobは、順番にしか実行できない→じゃあ、できないじゃん?
3. Orderを並列に発行する
Orderとは?
Orderが Jobを起動する
複数の Orderが同時に実行できる
Orderは StateとParameterを保持する
Orderの StateとParameterによって、実行する Jobに処理条件を与える事ができる
Node=Order Job 1State=1
Next_state=2
OrderQue
task
Order1
State=1
実行中
Node=Order Job 2State=2
Next_state=end
待機中
Node=Order Job 1State=1
Next_state=2
OrderQue
task
Node=Order Job 2State=2
Next_state=end
実行中
OrderQue
Order1
State=2
OrderQue
End NodeState=end
End NodeState=end
Job Chain
Job Chain
End NodeState=error
End NodeState=error
End NodeState=error
End NodeState=error
①
② Order2
State=1
task
実行中
Orderを並列実行する方法
2つの Job Chain ParallelSample: Orderを生成/発行するだけ ParallelExecution:ジョブを並列実行する
Job 1 execute execute execute sync Job 3
Job 2-1
Job 2-2
Job 2-3
Job Chain: ParallelSample
Job Chain: ParallelExecution
sync
ジョブ並列実行の仕組み
Orderは、実行 Jobの処理完了を待たずに次の Nodeに遷移する
Orderを生成実行する Job (execute)は、一つの Jobを異なる Stateと Parameterで3回繰り返し実行する
Job Chainは、異なるエントリーポイントが持てる
Job 1State=100
ExecuteState=p1
ExecuteState=p2
ExecuteState=p3
SyncState=sync
Job 3State=300
Job 2-1State=p1
Job 2-2State=p2
Job 2-3State=p3
Job Chain: ParallelSample
Job Chain: ParallelExecution
SyncState=sync
Order1 State=p1
Orderp1:1
State=p1
Order1 State=p2
Orderp2:1
State=p2
Order1 State=p3
Orderp3:1
State=p3
① ② ③
ParallelSample.job_chain.xml
<job_chain orders_recoverable="yes" visible="yes"> <job_chain_node state="100" job="anyJobBefore" next_state="p1" error_state="error"/> <job_chain_node state="p1" job="execute" next_state="p2" error_state="error"/> <job_chain_node state="p2" job="execute" next_state="p3" error_state="error"/> <job_chain_node state="p3" job="execute" next_state="sync" error_state="error"/> <job_chain_node state="sync" job="Sync" next_state="200" error_state="error"/> <job_chain_node state="200" job="anyJobAfter" next_state="success" error_state="error"/> <job_chain_node state="success"/> <job_chain_node state="error"/></job_chain>
execute job を異なる State とParameter で3回繰返して実行する
execute.job.xml <job order="yes" stop_on_error="no" tasks="3"> <params > <param name="job_chain" value="/SampleParallel/ParallelExecution"/> </params>
<script language="java:javascript"> <![CDATA[function spooler_process(){ var actOrder = spooler_task.order; var order = spooler.create_order(); var job_chain = spooler.job_chain(spooler_task.params.value("job_chain")); order.state = actOrder.state; order.params.merge(actOrder.params); order.id = order.state + ":" + actOrder.id; job_chain.add_or_replace_order(order); return true;} ]]> </script>
<monitor name="configuration_monitor"> <script java_class="sos.scheduler.managed.configuration.ConfigurationOrderMonitor" language="java" java_class_path=""/> </monitor>
<run_time /></job>
Job Chain に Order を追加し、もし同じ Order ID があれば上書きします。
Job Chain 内の Job に Parameterを受渡する内部 API を定義
返り値が true の場合 Next_state のNode に Order を進めます。
処理中の Order を返します。
Order を作成します。
Job Chain 名を返します。
注意!
JobScheduler1.5から 64bit Javaに対応した 64bit版が提供されましたが、 JavaScriptエンジンも32bit版の Spider Monkeyから 64bit版の Rhinoに変更になりました。
64bit版 JobSchedulerを使用する場合はjava:javascriptを選択し、 32bit版を使用する場合は javascriptを選択して下さい。
ParallelExecution.job_chain.xml
<job_chain orders_recoverable="yes" visible="yes"> <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>
p1->sync, p2->sync, p3->sync という3通りの実行フローを作成します
待ち合わせジョブ
Sync.job.xml
<job order="yes" tasks="1"> <params > <param name="ParallelExecution_required_orders" value="3"/> <param name="ParallelSample_required_orders" value="1"/> </params>
<script language="java" java_class="sos.scheduler.job.JobSchedulerSynchronizeJobChains" java_class_path=""/>
<run_time /></job>
待ち合わせを行う内部 API を定義
同期対象とする Order を指定するために、同期したい Order 数を Parameter として定義します。ParallelExecution で3回、 ParallelSample で1回の Order を実行するので、ParallelExecution_required_orders を3、 ParallelSample_required_ordersを 1 とします。
ジョブの排他制御 JobSchedulerでは、ロックファイルを使用してジョブの排他制御が可能
排他ロック:指定したジョブ以外の同時実行を禁止 ロック名 .lock.xmlという名前の XMLファイルを以下の内容で作成
排他制御したいジョブの定義ファイルに以下の内容を追記
共有ロック:指定した数のジョブの同時実行を許可する ロック名 .lock.xmlという名前の XMLファイルを以下の内容で作成
排他制御したいジョブの定義ファイルに以下の内容を追記
<job order="yes" stop_on_error="no"> <lock.use lock=” ロック名 " exclusive="yes"/>
<?xml version="1.0" encoding="ISO-8859-1"?>
<lock />
<job order="yes" stop_on_error="no"> <lock.use lock=” ロック名 " exclusive=”no"/>
<?xml version="1.0" encoding="ISO-8859-1"?>
<lock max_non_exclusive="3"/>同時実行できるジョブの数を定義
ParallelJob3.job.xml
<job order="yes" stop_on_error="no"> <lock.use lock="test" exclusive="yes"/>
<script language="shell"> <![CDATA[echo parallelJob3sleep 20 ]]> </script>
<run_time /></job>
このジョブは他のジョブと同時に実行できない排他ロックを設定
Job Chainの実行
ロックの状態
ログ