16
ジジジジジジジジ ジジジジ JobScheduler 第第第第第 2013/12/3

JobSchedulerでのジョブの多重実行・排他制御

  • Upload
    oss

  • View
    1.212

  • Download
    1

Embed Size (px)

DESCRIPTION

12/3第4回勉強会の資料です

Citation preview

Page 1: JobSchedulerでのジョブの多重実行・排他制御

ジョブの多重実行・排他制御

第4回 JobSchedulerユーザー会2013/12/3

Page 2: JobSchedulerでのジョブの多重実行・排他制御

作りたいジョブ

ジョブ1がジョブ2 1〜3を同時起動−ジョブ2 3だけは単独実行させたい−ジョブ2 1〜3全てが完了してから、ジョブ−3を起動する

ジョブ 1ジョブ 2-

1

ジョブ 2-2

ジョブ 2-3

ジョブ 3

Page 3: JobSchedulerでのジョブの多重実行・排他制御

JobSchedulerで並列ジョブの作り方

1. Stand Alone Jobジョブ定義のシェルで実行プログラムを複数実行する→エラー制御や排他制御まで書く必要がある→JobScheduler使う意味ないじゃん?

2. Job Chain Job Chainの Order Jobを同時に実行する

→Order Jobは、順番にしか実行できない→じゃあ、できないじゃん?

3. Orderを並列に発行する

Page 4: JobSchedulerでのジョブの多重実行・排他制御

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

実行中

Page 5: JobSchedulerでのジョブの多重実行・排他制御

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

Page 6: JobSchedulerでのジョブの多重実行・排他制御

ジョブ並列実行の仕組み

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

① ② ③

Page 7: JobSchedulerでのジョブの多重実行・排他制御

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回繰返して実行する

Page 8: JobSchedulerでのジョブの多重実行・排他制御

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 名を返します。

Page 9: JobSchedulerでのジョブの多重実行・排他制御

注意!

JobScheduler1.5から 64bit Javaに対応した 64bit版が提供されましたが、 JavaScriptエンジンも32bit版の Spider Monkeyから 64bit版の Rhinoに変更になりました。

64bit版 JobSchedulerを使用する場合はjava:javascriptを選択し、 32bit版を使用する場合は javascriptを選択して下さい。

Page 10: JobSchedulerでのジョブの多重実行・排他制御

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通りの実行フローを作成します

待ち合わせジョブ

Page 11: JobSchedulerでのジョブの多重実行・排他制御

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 とします。

Page 12: JobSchedulerでのジョブの多重実行・排他制御

ジョブの排他制御 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"/>同時実行できるジョブの数を定義

Page 13: JobSchedulerでのジョブの多重実行・排他制御

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>

このジョブは他のジョブと同時に実行できない排他ロックを設定

Page 14: JobSchedulerでのジョブの多重実行・排他制御

Job Chainの実行

Page 15: JobSchedulerでのジョブの多重実行・排他制御

ロックの状態

Page 16: JobSchedulerでのジョブの多重実行・排他制御

ログ