Condorを使ってみた(1)
以前オープンソースの運用ツールについてまとめたとき( http://d.hatena.ne.jp/aaabbb_200904/20090718/1247940134 )、オープンソースのジョブ管理のツールにはなかなかいいものがない、ということを書いた。その後、Red Hat MRGについて調べていたとき、パッケージ内にCondorというGrid向けのバッチジョブ実行ツールが含まれていることに気づいたのだが、こちらをよく調べてみると、ジョブ管理ツールとしてもかなり優秀と思われたので、少し使ってみた。
Condor ( http://www.cs.wisc.edu/condor/ ) の主な使い方は、バッチジョブを複数のノード(Computer Grid的にPCの空き時間を使うことにも対応している)に振り分けることのようだ。ただし、Condor自身は、
1.依存性を持ったジョブの実行
2.複数ノードでのジョブ実行
3.ジョブキューのレプリケーションによるHigh Availablity
など、Gridに対応しない特定ノードでのバッチジョブにも十分使用できる機能を持っているようだ。
ここでは、2台のFedora12の仮想マシン(fedora-virt7/8)を使用して、一通りCondorの機能を試してみた。
FeodoraではCondorは標準パッケージとして含まれているため、インストールはyumで実施できる。
# yum install condor
Condorは通常のインストールでは、単一ノードのジョブディスパッチを行う構成になる。まずは、Condorの起動を行い、その後、簡単なジョブを投入してみる。
# service condor start
Condorでジョブを投入するには、ジョブの内容を、設定ファイルとして持つ必要がある。例えば、dateコマンドを実行するジョブとしては、次のようになる。(ファイル名は /tmp/ccc.jobとした。)
Universe = vanilla Executable = /bin/date Arguments = Log = /tmp/ccc.log Output = /tmp/ccc.out Error = /tmp/ccc.error Notification = Error Queue
設定項目はそれぞれ Universe: Condorでの実行環境(シェルスクリプトの場合は、基本的にvanillaでOK), Executable: 実行ファイル, Argument: 引数 Log: ジョブ実行時のログ, Output: stdout, Error: stderr, Notification: ジョブ完了時にメールを送る条件, Queue: 実際にジョブを実行する となる。
上のジョブをCondorに投入するには次のコマンドを実施する。
$ condor_submit /tmp/ccc.job Submitting job(s). Logging submit event(s). 1 job(s) submitted to cluster 2.
ジョブの状態を見るには、submit_q を使用する。出力は次のようになる。
-- Submitter: fedora-virt7.jp.example.org : <192.168.1.137:42402> : fedora-virt7.jp.example.org ID OWNER SUBMITTED RUN_TIME ST PRI SIZE CMD 2.0 owner 3/23 00:22 0+00:00:00 I 0 0.1 date 1 jobs; 1 idle, 0 running, 0 held
ジョブが正しく実行されているかは、指定したログファイルを確認する。単一ノードの場合には特に問題なく実行されることと思われる。。
さて、ここまでで1台でCondorを使用する方法についてまとめたのだが、2台以上で使う場合には、各ノードの役割を定める必要がある。ノードごとの役割としては、計算ノード、管理ノード、ジョブ投入用ノードの、主に3つがあるが、今回は2台しかノードが無いので、fedora-virt7を管理ノード兼ジョブ投入用ノード、fedora-virt8を計算ノードとしている。
ノードごとの動作を定めるには、設定ファイルとして /var/lib/condor/condor_config.local の設定を行う。詳しい設定内容についてはこちらを参照。
http://kbase.redhat.com/faq/docs/DOC-23598
動作確認を行うため、先ほどのジョブを、fedora-virt8で実行するようにしてみる。ジョブが投入されたノードと異なるノードでジョブを実施するには、ジョブファイルに、次の2行を加える必要がある。
should_transfer_files = YES when_to_transfer_output = ON_EXIT
さらに、fedora-virt8(ホスト名は、 fedora-virt8.jp.example.org )でジョブを実施する条件として、次を書き加える。
Requirements = Machine == "fedora-virt8.jp.example.org"
この状態で、ログを確認すると、
... 000 (145.000.000) 03/21 12:46:01 Job submitted from host: <192.168.1.137:33797> <== fedora-virt7 ... 001 (145.000.000) 03/21 12:46:22 Job executing on host: <192.168.1.182:32967> <== fedora-virt8 ...
のような記述が生じ、確かに別のノードでジョブが実施されていることが分かる。
ここまででCondorのインストール、単一ノードでのジョブの実行、別のノードでのジョブの実行までをまとめたので、次回以降、依存性を持ったジョブの実施方法についてまとめてみようと思う。