Luceneで分散インデクシング

6 Jan

最近Luceneを使ってみている。Luceneを使って実験用のブログ検索エンジン(ぽいもの)を作っているが、とにかくインデクシングが遅い。Nutchでは、Luceneのインデックスをいくつものマシンに作成して、インデクシング/検索共に分散してやることが推奨されているようだが、残念ながら常時占有できるマシンがたくさんあったりはしない。

Luceneの本によれば、マルチスレッドでメモリ上にインデックスを作成して、あとでまとめて1つのインデックスをファイルシステム上に作るというのが、Luceneのインデクシングを高速化する常套手段らしい。しかし、それで高速化できるのは最大でも(インデックスのマージにかかる時間が0としても)1つのマシン上のCPU数だけで、大幅な高速化はできない。

そこで、複数のマシンでメモリ上にできるだけ大きな(メモリぎりぎりの)インデックスを作成し、それをファイルに書き出してネットワーク経由で中央に集め、中央でマージするという方法を試してみた。

手順は以下の通り
・Lucene2.0ではRAMDirectoryはシリアライズできないので、Lucene-601のパッチを当ててビルドする。
・インデックス対象ドキュメントをノードに配布する
・ノードでドキュメントをRAMDirectory上のインデックスに登録し、RAMDirectoryをファイルにシリアライズする
・RAMDirectory(をシリアライズしたファイル)を中央に集める
・中央で1つのFSDirectoryにマージ

この結果、単純に1台でインデクシングする場合と比べて5〜10分の1程度の時間でインデクシングできるようになった。
マシンは8台利用したが、処理時間のほとんどは最後のマージにかかっているので、これ以上台数を増やしてもそんなに速くならないだろう。
FSDirectoryのサイズが増えるに従って、操作がどんどん遅くなるようだ(もちろん、普通に考えて妥当ではあるけど)。
中央でマージする際に、ハフマン符号を構成する時みたいに小さい2つを選んでマージという操作の繰り返すようにしてみると、もっと速くなるかもしれない。

Leave a Reply

Your email address will not be published.