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のインストール、単一ノードでのジョブの実行、別のノードでのジョブの実行までをまとめたので、次回以降、依存性を持ったジョブの実施方法についてまとめてみようと思う。