2011年8月16日

Waf から Solr を起動させる

Waf を使うと、Python で色々な処理を記述できます。 Waf は普通は C 言語などのコンパイルに使いますが、 ある条件に従って何らかの処理を実行できると便利ですので、他のことにも流用してみます。 以前に、Solr をダウンロードして解凍できることを確認しましたので、 今回は、そこから Solr を起動させます。

実行環境の準備

まずは virtualenv で実行環境を作成し、 waf コマンドを実行できるようにします。

$ virtualenv --distribute solr-test
$ cd solr-test
$ source bin/activate
$ curl http://waf.googlecode.com/files/waf-1.6.7 >bin/waf
$ chmod +x bin/waf
$ waf
Waf: Run from a directory containing a file named 'wscript'

wscript が見つかりません、というエラーが表示されれば正常に設定できています。

Solr を起動させる

Solr をダウンロードして解凍する処理は、以前の内容と似たような感じです。 Python の urllibtarfile モジュールを使います。

Solr の配布アーカイブには start.jar というブートストラップが含まれています。 これは example ディレクトリにありますので、そこへ移動し、JAR を実行します。 (その他の基本的な内容物に関してはこちらの記事で触れています - DotCloud で Solr を使ってみる)

$ cd {apache-solr-dir}/example/
$ java -jar start.jar

毎回これを実行しても構わないのですが、Solr の設定を変更したい場合にはちょっと不便です。 デフォルトでは実行したディレクトリ直下の solr ディレクトリを見に行きますが、 たとえば、 /tmp/solr から設定ファイルを読み込みたい場合には次のように引数を与えます。

$ java -Dsolr.solr.home=/tmp/solr -jar start.jar

"solr.home" ではなく、"solr.solr.home" なので、分かっていても間違えてしまいます。 ということで、スクリプトにまとめておきたいわけです。

スクリプト

wscript にまとめると、次のようになります。

APPNAME = 'solr-test'
VERSION = '1.0.0'

top = '.'
out = '_build'

import urllib
import tarfile

from waflib.Task import Task

SOLR_VERSION = '3.3.0'
SOLR_PACKAGE = 'apache-solr-%s.tgz' % (SOLR_VERSION,)
SOLR_MIRROR = 'http://ftp.riken.jp/net/apache/lucene/solr/%s/%s' % (SOLR_VERSION, SOLR_PACKAGE)


def configure(ctx):
    p = ctx.path.find_resource(SOLR_PACKAGE)
    if p is None:
        urllib.urlretrieve(SOLR_MIRROR, SOLR_PACKAGE)
    jar = ctx.path.ant_glob('apache-solr-*/example/start.jar')
    if not jar:
        with tarfile.open(SOLR_PACKAGE) as tar:
            tar.extractall()


def run_solr(ctx):
    jar_dir = ctx.path.find_dir('apache-solr-%s/example' % (SOLR_VERSION,))
    solr_dir = ctx.path.find_node('solr')
    ctx.exec_command(['java', '-Dsolf.solr.home=%s' % (solr_dir.abspath(),),
                      '-jar', 'start.jar'], cwd=jar_dir.abspath())


wscript においてファイルやディレクトリは「ノード」という単位で扱われます。 ノードの取得方法には数種類あり、上記のスクリプトでは次の4つを使っています。 (使い分けている、というよりは、複数種類を例示している。)

  • find_resource : ビルドしたノードかソースファイルを探します。
  • find_dir : ファイルシステムからフォルダを探します。
  • find_node : ファイルシステムからファイルやフォルダを探します。
  • ant_glob : Ant のファイルマッチパターンに従ってファイルを探します。

「ファイルシステムから」という記述に意味があり、 ビルドの依存関係を記述するためには、 ファイルシステムには存在しないノードを定義することになります。 とはいえ、ここでのスクリプトには関係ありませんので、無視しておきます。

その他のノードの扱いは、ソースコードを読むのが最も手っ取り早いかもしれません...

実行方法

上記 wscriptconfigure ターゲットを実行して、 アーカイブをダウンロードしてから展開します。

$ waf configure

次に、設定ファイルを編集できるように、トップレベルにコピーします。

$ cp -r apache-solr-3.3.0/example/solr .

最後に、 run_solr ターゲットを実行します。

$ waf run_solr

ブラウザで http://localhost:8983/solr/admin にアクセスすると、 Solr の管理画面が表示されるはずです。

あとは、 solr/conf にあるファイルを編集することで、Solr の中身をカスタマイズできます。

終わりに

Waf から Solr を起動させてみました。 定型の処理ならシェルスクリプトにまとめてしまえば良いのですが、 Windows でも処理を自動化できると便利なこともあります。

Waf だと単一のファイルを配置すれば良いだけですので、 簡単に手順を共有できそうですね。

コメントを投稿