-
Kettleの実行について
KettleのjobをCronにて1分間隔で実行しようと思っています。以下について何か良い対処法がありましたら、教えてください。m(_ _)m
1.前回のjobが実行中の場合、新規jobが実行されないようにしたい。
現在のところ、job実行時にファイルを作り、job終了時にそのファイルを削除する、というステップを作成し、そのファイルの有無によって、前回のjobが起動中かどうかを判断するルーチンを考えていますが、よりスマートな方法を知っていたら教えてください。m(_ _)m
2.job実行中でなんらかのトラブルにより無応答になった(処理が終わらない)場合、自動的にjobを終了するような形にしたい。
job終了時間制限等を設けることは可能でしょうか?また他に何かやり方はありますでしょうか。
以上です。よろしくお願いします。
-
l.cozy56さん、
こんにちは。
> 1.前回のjobが実行中の場合、新規jobが実行されないようにしたい。
JOBのスタートステップのスケジュール機能を使用すれば可能と思いますが、cronを使用する場合は、すでに記載されているロックファイルを作成する方法がBasicではないかと思います。
※JOBスタートステップを使用する場合※
例えば、以下の構成でJOBを作成しておいて、JOB1内のスタートステップのスケジュール機能(スタートステップをダブルクリックすると出てくるやつです)で1分間隔で起動としておけば、JOB2が終わってから1分後に再度JOB2が起動されます。
JOB1(起動用) → JOB2(実際に実行したいJOB)
> 2.job実行中でなんらかのトラブルにより無応答になった(処理が終わらない)場合、自動的にjobを終了するような形にしたい。
私の知る限りでは、JOBの機能として、JOBを終了させるものはなかったと思います(もし誰かご存知でしたら、ご享受ください)。
1と2を同時に実現する場合は、以下の方法が良いのではないかと思います。
(1)JOB実行時にロックファイルを作成し、その中にプロセスIDと起動時間(ファイル作成時間)を入れておく。
(2)次のJOBを実行する際に、ロックファイルとその中の起動時間を確認し、無応答のしきい値を超える場合は、ロックファイル内のプロセスIDをKILLする。
なお、この手順の場合は、プロセスがKILLされた後のJOB起動を考慮する必要があるため、ロックファイルの有無を確認する際に、内部のプロセスIDを持つプロセスが実際に動作中かどうかを確認する必要があると思います。
おそらく、これ以外の良い方法があるかと思いますが、一例として。
簡単ですが、ご確認のほどよろしくお願いいたします。
--
michi
-
michi様
ご回答、ありがとうございます。
JOBスタートステップっていうスケジューラ(と呼べばいいのか?)、あるんですね。
初めて知りました。勉強になります。
無応答の場合の強制終了方法、参考になります。
早速、試させていただきます。
ちなみに、kettleを現場で使っている方はjob等の無応答の場合、どのようにしているのか?ちょっと知りたいです。
(そもそもkettleで無応答自体起こったことない、という幸せな情報があれば特に知りたいです)
-
l.cozy56さん、
こんにちは。
> ちなみに、kettleを現場で使っている方はjob等の無応答の場合、どのようにしているのか?ちょっと知りたいです。
> (そもそもkettleで無応答自体起こったことない、という幸せな情報があれば特に知りたいです)
無応答というものを「処理がどこかで進まなくなり、終了しない状態」と定義すると、、
kettleでの無応答は、ETLの組み方によって発生します。
私が経験したのは以下の2パターンです。
・JavaScript内での無限ループ
・比較的大きなデータを使用している場合に複雑なETLを組んだ時のデータ詰まり
→データストリームを2つに分けて、別々の処理を行いAppendStreamやJoinで1つに戻したりするとまれに発生したことがあります。
その他、こんなパターンを経験したよとか、あれば共有いただけるとありがたいです。
以上、よろしくお願いいたします。
--
michi